Cosa è meglio: includere HTML all'interno del codice PHP o al di fuori di esso?


28

Guarda questo:

<?php
echo "Hello World";
?>
<br />
<?php
echo "Welcome";
?>

E ora guarda questo:

<?php
echo "Hello World";
echo "<br />";
echo "Welcome";
?>

Quale degli esempi sopra è considerato migliore (almeno dal punto di vista delle prestazioni)?

So che gli esempi sono banali, ma voglio seguire le buone pratiche fin dall'inizio, quindi quando ho sempre più linee non influenzerebbero le prestazioni o qualsiasi altra cosa in modo negativo.


14
Questo non sembra essere molto popolare in PHP, ma nota che in altri ecosistemi, entrambi sono considerati cattivi e l'alternativa corretta è creare un modello di tutte le parti statiche con una logica minima per includere parti dinamiche, e quindi renderlo dal linguaggio di programmazione.

1
@delnan - Dovresti considerare di postarla come una risposta, in una forma leggermente espansa. È molto più pulito.
jmort253,

@ jmort253 L'ho preso in considerazione, ma ho pochissime conoscenze in PHP, quindi non ho potuto parlare delle migliori pratiche nel mondo PHP.

Che problema stai cercando di risolvere?
Jim G.

In termini di prestazioni non importa. La rete è molto più lenta in confronto. Il costo di trasferimento è significativamente più alto, il che rende il costo di generazione insignificante in confronto.
Martin York,

Risposte:


23

Come sottolinea il commento, dovrebbe essere fatto da modelli. Ma se solo le tue due scelte sono possibili. Il caso 1 sarà migliore. Questo è lo stesso concetto del layout di gonfiaggio Android di XML o di creazione dell'interfaccia utente programmaticamente. Il tuo <br/>è un contenuto statico dal tuo html e tutto ciò che il tuo server farà sarà mostrarlo. Ma se usi php, per eseguirlo, questo utilizzerà le risorse dei tuoi server ed elaborerà.

Ecco come dovrebbe essere fatto: index.php:

<?php
include 'header.html';
...
include 'footer.html';  
?>  

header.html e footer.html sono modelli.


1
Ho letto un libro per Kevin Yank che è "PHP & MySQL Novice to Ninja" su qualcosa chiamato Controller e template. Sono le stesse cose di cui mi parlavi o sono diverse? se sono uguali come mettere il codice in file diversi lo farà funzionare meglio?
irritato il

I modelli rendono il tuo sito Web o la tua applicazione più sensibili. Vedi come intestazioni e piè di pagina o persino post di StackOverflow sono gli stessi? Stanno usando lo stesso modello e lo riempiono di dati dinamici.
wtsang02,

Qual è la ragione principale dietro questo? E se non lo facciamo in questo modo? cosa perderemo?
irritato il

Vediamo questo. Questo è il 4 ° commento di questo post di risposta. Se ora visualizzi questa pagina sul sorgente, vedrai "<div> <span ...> ... </span> <a ...> ... </a>" Mano di imaging che codifica il 4000 ° commento. È possibile? o semplicemente crealo come modello e fai 'aggiungere' al tuo server quando è necessario.
wtsang02

1
Inoltre @wtsang, non hai mai solo queste due scelte, ne hai sempre una terza, corri (o impara.)
ocodo

54

Per rispondere direttamente alla tua domanda: non fare mai eco a testo statico o HTML. Lascialo fuori dal tuo PHP.

<?php echo "<p>Hello World</p>"; // Alway wrong. ?>

<p>Hello World</p>  <!-- Does the same thing, faster, and is more readable. -->

Scappare in PHP è uno spreco se tutto ciò che devi fare è passare in testo statico o HTML statico. Tutto il codice all'interno di <?php ?>viene inviato a PHP per essere interpretato. Ciò significa che il tuo sito web è più lento e stai sprecando elettricità se stai trasmettendo grandi quantità di testo statico a PHP senza motivo. (A volte c'è un motivo.)

La migliore pratica è far funzionare la tua logica e il tuo grugnito nei file senza HTML, solo PHP.

Il modo in cui mi piace farlo è con un framework MVC. Ho puro PHP nei modelli e nei controller e una combinazione di HTML e PHP nelle viste. Non è necessario un framework MVC; potresti semplicemente inserire la tua miscela di HTML nei file modello, che poi includerai nei tuoi file PHP puri.

Una volta che hai creato le tue variabili (che non includono HTML) in file PHP puri, puoi passarle al file con il tuo HTML. Lì, e solo lì, va bene mescolare HTML e PHP. Ma questo è un aspetto importante ma, quando si lavora con file con HTML, mantenere il PHP al minimo.

Fortunatamente, PHP viene fornito con strumenti intuitivi che facilitano la lettura di PHP se miscelato con HTML.

Sintassi alternativa

La migliore pratica è usare la sintassi PHP normale quando si scrive PHP puro, ma la sintassi alternativa, quando si mescolano PHP e HTML.

In normali file PHP senza HTML:

if ($something) {
  do_something(); // do_something() shouldn't echo or print.
}

Questo è bello per puro PHP, ma non è l'ideale quando si esce da HTML. In particolare, le parentesi graffe di chiusura sono spesso difficili da capire quando si presentano in grandi pile di HTML.

Sembra, in base alla tua domanda, che avresti scritto, in un file che mescola HTML e PHP, questo:

<?php
  if ($something) {
    echo '<p>Hello World.</p>';
  }
?>

Per i motivi sopra descritti, vogliamo che l'HTML non venga inviato a PHP. Facciamo così:

<?php if ($something) { ?>
  <p>Hello World.</p>
<?php } ?>

Abbiamo rimosso il nostro HTML dai nostri tag PHP, il che è un miglioramento. Ma potremmo andare oltre.

Notare quanto non informativo il tutore di chiusura è? Non sappiamo se sta chiudendo un ciclo o un'istruzione if. Questo sembra banale nell'esempio sopra, ma spesso ci sono dozzine di righe di HTML all'interno di if / endif all'interno di un loop / endloop.

La migliore pratica è che in un file che mescola PHP e HTML, usi la sintassi alternativa, che omette l'apertura e la chiusura delle parentesi graffe ( { }):

<?php if ($something): ?>
  <p>Hello world.</p>
<?php endif; ?>

A parte la semantica della nuova sintassi ( :e endif;invece di {e }), dovresti notare due cose:

  1. Ancora una volta, HTML e testo, mentre controllati da PHP, sono al di fuori dei <?php ?>tag, quindi non vengono interpretati. Per i motivi sopra descritti, questo è buono.
  2. Questo è molto più informativo che se questo fosse tutto php, compresi gli apparecchi di chiusura casuali ( <?php } ?>) che chiudono le cose che sono difficili da trovare dove si sono aperti (perché sono mescolati con un briciolo di HTML dall'aspetto disordinato). Ancora una volta, immagina un grande file HTML con loop e istruzioni if. Specificare cosa si sta chiudendo può chiarire molto.

La stessa sintassi del modello può essere utilizzata anche per i loop:

<?php foreach ($things as $thing): ?>
  <li><?php echo $thing; ?></li>
<?php endforeach; ?>

Tag brevi

Un altro ottimo strumento fornito da PHP che, ancora una volta, si desidera utilizzare solo quando si mescolano PHP e HTML insieme, sono i tag brevi. Potrebbe essere necessario attivare i tag brevi nel file php.ini. Una volta attivati, i tag brevi rendono tutto ancora più leggibile.

Senza i tag brevi, devi scrivere, <?php echo $something; ?>ma con i tag brevi puoi scrivere <?=$something?>e avrà lo stesso esatto risultato.

Quando si combinano tag brevi e la sintassi alternativa di PHP, è possibile scrivere davvero alcuni file HTML eleganti, che includono elementi PHP. Prendendo il nostro ultimo esempio di loop (solo la parte all'interno del loop), i tag brevi ci consentono di ridurre:

<li><?php echo $thing; ?></li>

a

<li><?=$thing?></li>

che è molto più leggibile.

Potremmo andare oltre? Sì. Usando vari sistemi di template puoi fare cose come:

<li>{thing}</li>

Che è incredibilmente leggibile. I sistemi di template, tuttavia, sono molto al di fuori dell'ambito della domanda originale (che comunque ho lasciato qualche tempo fa).


4
+1 Per essere un buon consiglio per tutti. La sintassi del controllo alternativo e i tag brevi sono estremamente importanti per iniziare con i modelli e la separazione della logica dalla presentazione.
Will Meldon,

1
I tag brevi devono essere usati con cautela. Se stai creando codice che verrà riutilizzato, non puoi garantire che la short_open_tagdirettiva sia sempre attiva. PHP 5.4 rende <?=$thing?>disponibile tutto il tempo, anche quando short_open_tagè disabilitato. Inoltre, short_open_tagè disattivato per impedire conflitti con XML.
Chris,

3
+1 per mostrare le diverse alternative, passando alla risposta migliore.
Tola Odejayi,

1
Forse era vero, ma ho appena controllato gli opcode (cioè ciò che è effettivamente gestito dal motore) in PHP7, e mescolare PHP / HTML certamente non "risparmia elettricità" evitando di passare il testo statico. <?php $foo='ABC'; echo '<div>', $foo, '</div>'e <?php $foo='ABC'; ?><div><?=$foo?></div>producono gli stessi identici codici operativi, ovvero sono identici.
Josh di Qaribou,

Sulla nota relativa ai sistemi di templating, l'approccio di templating più semplice che consentirebbe il tuo esempio è una semplice eredità. Heredoc ti permette di dire <li>{$thing}</li>come hai mostrato, con il vantaggio rispetto alle doppie virgolette che non devi sfuggire alle doppie virgolette al suo interno. Puoi anche assegnare heredoc o passarlo a funzioni, quindi è molto più pulito che php / html se lo usi in blocchi, ad es. array_reduce($items, function($s, $item) { $name = htmlspecialchars($item['name']); return $s . <<< EOT <li>{$name}: {$item['price']}</li> EOT; })
Josh di Qaribou,

4

Stai imparando, dimentica le prestazioni nelle pagine PHP. Invece, scegli il modo più semplice da leggere .

Guardando i tuoi due esempi, il secondo è sicuramente il più facile da leggere, anche se penso che sia a causa della spaziatura che hai usato. Dici che stai cercando di sviluppare buone abitudini fin dall'inizio, penso che il tuo tempo possa essere speso meglio facendo leggere bene il tuo codice. Questo potrebbe significare riscrivere una sezione più volte fino a quando non sei soddisfatto.

Se sei davvero appassionato di dietro le quinte, proverò a spiegare cosa succede con i contenuti statici in una pagina PHP. Una delle prime cose è "analizzare" l'intera pagina in codice eseguibile (come vedi tra i <?php ?>tag). Una parte di questo è trasformare qualsiasi testo statico in un echo.

Così questo:

<?php echo "Hello World"; ?>
<br />
<?php echo "Welcome"; ?>

si trasforma in qualcosa del tipo:

echo "Hello World";
echo "<br />";
echo "Welcome";

C'è un costo molto piccolo associato all'analisi, ma nessuna differenza nell'esecuzione del codice risultante. Se stai usando un acceleratore PHP, l'analisi viene eseguita solo una volta e poi memorizzata nella cache, quindi non vedresti alcuna differenza di prestazioni dopo il caricamento della prima pagina.

Ricorda: facile da leggere!


1
Non sono d'accordo. Non si tratta solo di prestazioni, ma di apprendimento. Non è un buon consiglio imparare una pratica sbagliata.
Isacco il

Non è vero che il "testo statico" si trasforma in un echo, se lo intendi letteralmente (cosa che la tua lingua implica). Il risultato è lo stesso, ma i metodi sono molto diversi. Quello che chiami "testo statico" sta in effetti scappando da PHP a HTML. Quando ciò accade, il server inizia a inviare testo non elaborato. Non analizza tramite PHP, come farebbe con echo. Le implicazioni sulle prestazioni sono probabilmente piccole in qualsiasi circostanza non inventata, ma la differenza meccanicistica è importante.
underscore_d

0

Una delle migliori caratteristiche di PHP è stata progettata per essere integrata in HTML. Di solito viene utilizzato nella creazione di modelli. Semplifica la lettura e la manutenzione del codice, poiché separa il codice PHP dall'HTML.

Ma se stai solo stampando una pagina statica come "Hello World!" è una cattiva idea.


0

Per rispondere semplicemente alla tua domanda: dato il tuo codice di esempio, ci sarà poca o nessuna differenza nella prestazione. PHP viene elaborato a livello di server / host mentre HTML viene elaborato dall'agente utente / persona che guarda la tua pagina web sul proprio browser. Chi sarà più veloce? Difficile da determinare.

Sono d'accordo con gli altri dicendo che ognuno ha i suoi punti di forza e di debolezza e può lavorare davvero bene insieme. PHP è programmabile e può eseguire calcoli e lavorare con variabili. Per questo motivo tutte le mie pagine finiscono per essere PHP e invocano frammenti di codice HTML - modelli come è stato menzionato e inseriscono variabili in modo che il mio HTML diventi dinamico.

Nel tuo esempio potresti mettere insieme l'HTML in un'unica istruzione PHP in questo modo:

    <?php echo "Hello World<br>Welcome"; ?>

Spero che questo aiuti a chiarire un po '.


0

ci sono limitazioni all'uso dell'HTML all'interno di PHP.

Il più delle volte avresti il ​​tuo HTML fuori. Dovresti creare una pagina come faresti se non stessi usando PHP, quindi aggiungere PHP nelle aree del documento in cui ne hai bisogno. Puoi avere diversi blocchi di PHP in un documento.

Lavorare con PHP Inside HTML ha alcuni esempi:

https://www.thoughtco.com/php-with-html-2693952


-1

È generalmente considerato una forma errata per generare codice HTML da PHP. Ci sono diverse ragioni per questo, ma la principale è che è più facile, specialmente a lungo termine, mantenere il codice se il codice HTML e PHP è separato.

È proprio come HTML, CSS e Javascript; è solo molto più semplice e pratico tenerlo separato.

Tecnicamente, tuttavia, non fa assolutamente alcuna differenza il modo in cui si producono output. Per PHP sono solo byte di fila.


6
Fa la differenza. <?php echo 'hello'; ?>viene passato a PHP. hellonon viene passato a PHP. Tutto ciò che viene passato a PHP viene convertito in bytecode quindi interpretato. Ciò richiede tempo, potenza di elaborazione ed elettricità.
Ted,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.