¿Qué es mejor: incluir HTML dentro del código PHP o fuera de él?

28

Mira esto:

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

Y ahora mira esto:

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

¿Cuál de los ejemplos anteriores se considera mejor (al menos desde el punto de vista del rendimiento)?

Sé que los ejemplos son triviales, pero quiero seguir los hábitos de buenas prácticas desde el principio para que cuando tenga más y más líneas no afecten negativamente el rendimiento o lo que sea.

erupción
fuente
14
Esto no parece ser muy popular en PHP, pero tenga en cuenta que en otros ecosistemas, ambos se consideran malos y la alternativa adecuada es crear una plantilla de todas las partes estáticas con una lógica mínima para incluir partes dinámicas, y luego representarla desde el lenguaje de programación.
1
@delnan - Debería considerar publicar eso como respuesta, en una forma ligeramente expandida. Eso es mucho más limpio.
jmort253
@ jmort253 Lo he considerado, pero tengo muy poco conocimiento de PHP, por lo que no podría hablar de las mejores prácticas en el mundo de PHP.
¿Que problema estas tratando de resolver?
Jim G.
En términos de rendimiento no importa. La red es mucho más lenta en comparación. El costo de transferencia es significativamente mayor, lo que hace que el costo de generación sea insignificante en comparación.
Martin York

Respuestas:

23

Como señala el comentario, debe hacerse mediante plantillas. Pero si solo tu opción dos es posible. El caso 1 será mejor. Este es el mismo concepto que el diseño de inflado de Android por xml, o haciendo programáticamente la UI. Tu <br/>es un contenido estático de tu html y todo lo que hará tu servidor es mostrarlo. Pero si usa php, para ejecutarlo, esto usará los recursos de su servidor y será computacional.

Así es como debe hacerse: index.php:

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

header.html y footer.html son plantillas.

wtsang02
fuente
1
Leí un libro para Kevin Yank que es "PHP & MySQL Novato a Ninja" sobre algo llamado Controladores y plantillas. ¿Son estas las mismas cosas que me estabas diciendo o son diferentes? si son iguales, ¿cómo colocar el código en diferentes archivos hará que funcione mejor?
erupción
Las plantillas hacen que su sitio web o aplicación sea más flexible. ¿Ves cómo los encabezados y pies de página o incluso las publicaciones de StackOverflow son iguales? Están usando la misma plantilla y la están llenando de datos dinámicos.
wtsang02
¿Cuál es la razón principal detrás de eso? ¿Qué pasa si no lo hacemos así? que perderemos
erupción
Veamos esto. Este es el cuarto comentario de esta publicación de respuestas. Si ve esta página en la fuente ahora, verá "<div> <span ...> ... </span> <a ...> ... </a>" Imagen de mano que codifica el comentario número 4000. ¿Es eso posible? o simplemente haga esto como plantilla y haga que su servidor 'agregue' esto cuando sea necesario.
wtsang02
1
También @wtsang, nunca solo tienes esas dos opciones, siempre tienes una tercera, correr (o aprender)
ocodo
54

Para responder directamente a su pregunta: nunca haga eco de texto estático o HTML. Deja eso fuera de tu PHP.

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

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

Escapar a PHP es un desperdicio si todo lo que vas a hacer es pasar texto estático o html estático. Todo el código dentro de <?php ?>se envía a PHP para ser interpretado. Esto significa que su sitio web es más lento y está desperdiciando electricidad si pasa grandes cantidades de texto estático a PHP sin ningún motivo. (A veces hay una razón).

La mejor práctica es hacer que su lógica y gruñido trabajen en archivos sin HTML, solo PHP.

La forma en que me gusta hacer esto es con un marco MVC. Tengo PHP puro en los modelos y controladores, y una mezcla de HTML y PHP en las vistas. No necesita un marco MVC; simplemente podría pegar su mezcla de HTML en archivos de plantilla, que luego incluirá en sus archivos PHP puros.

Una vez que haya creado sus variables (que no incluyen HTML en ellas) en archivos PHP puros, puede pasarlas al archivo con su HTML. Allí, y solo allí, está bien mezclar HTML y PHP. Pero, y esto es importante, pero cuando trabaje con archivos que tienen HTML, mantenga el PHP al mínimo.

Afortunadamente, PHP viene con herramientas amigables para hacer que PHP sea más fácil de leer cuando se mezcla con html.

Sintaxis Alternativa

La mejor práctica es usar la sintaxis PHP normal al escribir PHP puro, pero la sintaxis alternativa, al mezclar PHP y HTML.

En archivos PHP normales sin HTML:

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

Esto es hermoso para PHP puro, pero no es ideal cuando se escapa de HTML. En particular, las llaves de cierre a menudo son difíciles de entender cuando aparecen en grandes pilas de HTML.

Parece, en base a su pregunta que habría escrito, en un archivo que combina HTML y PHP, esto:

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

Por los motivos descritos anteriormente, queremos que el HTML no se envíe a PHP. Hacemos esto así:

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

Sacamos nuestro HTML de nuestras etiquetas PHP, lo cual es una mejora. Pero podríamos ir más allá.

¿Te das cuenta de lo poco informativo que es el corchete de cierre? No sabemos si está cerrando un ciclo o una declaración if. Esto parece trivial en el ejemplo anterior, pero a menudo hay docenas de líneas de HTML dentro de if / endif dentro de un bucle / endloop.

La mejor práctica es que en un archivo que mezcla PHP y HTML, utilice la sintaxis alternativa, que omite abrir y cerrar llaves ( { }):

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

Además de la semántica de la nueva sintaxis ( :y en endif;lugar de {y }), debe notar dos cosas:

  1. Nuevamente, el HTML y el texto, aunque controlados por PHP, están fuera de las <?php ?>etiquetas, por lo que no se interpretan. Por las razones descritas anteriormente, esto es bueno.
  2. Esto es mucho más informativo que si se tratara de php incluyendo llaves de cierre aleatorias ( <?php } ?>) cerrando cosas que son difíciles de encontrar donde se abrieron (porque están mezcladas con un montón de HTML desordenado). De nuevo, imagine un gran archivo HTML con bucles y sentencias if. Especificar lo que está cerrando puede aclarar mucho.

La misma sintaxis amigable con la plantilla se puede usar también para bucles:

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

Etiquetas cortas

Otra gran herramienta proporcionada por PHP que, una vez más, solo desea usar al mezclar PHP y HTML, son las etiquetas cortas. Es posible que deba activar etiquetas cortas en el archivo php.ini. Una vez activadas, las etiquetas cortas hacen que todo sea aún más legible.

Sin etiquetas cortas, tiene que escribir, <?php echo $something; ?>pero con etiquetas cortas puede escribir <?=$something?>y tendrá exactamente el mismo resultado.

Al combinar etiquetas cortas y la sintaxis alternativa de PHP, realmente puede escribir algunos archivos HTML elegantes, que incluyen elementos PHP. Tomando nuestro último ejemplo de bucle (solo la parte dentro del bucle), las etiquetas cortas nos permiten reducir:

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

a

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

lo cual es mucho más legible.

¿Podríamos ir más lejos? Sí. Usando varios sistemas de plantillas puede hacer cosas como:

<li>{thing}</li>

Lo cual es asombrosamente legible. Sin embargo, los sistemas de plantillas están muy fuera del alcance de la pregunta original (que dejé hace un tiempo de todos modos).

Ted
fuente
44
+1 Por ser un buen consejo para todos. La sintaxis de control alternativa y las etiquetas cortas son sumamente importantes para comenzar con las plantillas y la separación de la lógica de la presentación.
Will Meldon
1
Las etiquetas cortas deben usarse con precaución. Si está creando un código que se reutilizará, no puede garantizar que la short_open_tagdirectiva siempre esté activada. PHP 5.4 pone a <?=$thing?>disposición todo el tiempo, incluso cuando short_open_tagestá deshabilitado. Además, el valor short_open_tagpredeterminado es apagado para evitar conflictos con XML.
Chris
3
+1 para mostrar las diferentes alternativas, progresando a la mejor respuesta.
Tola Odejayi
1
Tal vez solía ser cierto, pero acabo de comprobar los códigos de operación (es decir, lo que realmente funciona con el motor) en PHP7, y mezclar PHP / HTML ciertamente no "ahorra electricidad" al evitar pasar texto estático. <?php $foo='ABC'; echo '<div>', $foo, '</div>'y <?php $foo='ABC'; ?><div><?=$foo?></div>dan como resultado exactamente los mismos códigos de operación, es decir, son idénticos.
Josh de Qaribou
En la nota sobre los sistemas de plantillas, el enfoque de plantillas más simple que permitiría su ejemplo es un simple heredoc. Heredoc le permite decir <li>{$thing}</li>como lo ha mostrado, con la ventaja sobre las comillas dobles de que no tiene que escapar de las comillas dobles dentro de él. También puede asignar heredoc o pasarlo a funciones, por lo que es mucho más limpio que php / html si lo está usando en bloques, por ejemplo. array_reduce($items, function($s, $item) { $name = htmlspecialchars($item['name']); return $s . <<< EOT <li>{$name}: {$item['price']}</li> EOT; })
Josh de Qaribou
4

Estás aprendiendo, olvídate del rendimiento en las páginas PHP. En su lugar, elija la forma más fácil de leer .

Mirando sus dos ejemplos, el segundo es definitivamente el más fácil de leer, aunque creo que es por el espacio que ha utilizado. Dices que estás buscando desarrollar buenos hábitos desde el principio, creo que puedes dedicar mejor tu tiempo haciendo que tu código se lea bien. Esto podría significar reescribir una sección varias veces hasta que esté satisfecho con ella.

Si está realmente interesado en el detrás de escena, explicaré lo que sucede con el contenido estático en una página PHP. Una de las primeras cosas es "analizar" toda la página en código ejecutable (como se ve entre las <?php ?>etiquetas). Una parte de esto es convertir cualquier texto estático en un echo.

Así que esto:

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

se transforma en algo como:

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

Hay un costo muy pequeño asociado con el análisis, pero no hay diferencia en la ejecución del código resultante. Si está utilizando un acelerador PHP, el análisis solo se realiza una vez y luego se almacena en caché, por lo que no verá ninguna diferencia de rendimiento después de la primera carga de la página.

Recuerde: ¡fácil de leer!

GavinH
fuente
1
Estoy en desacuerdo. No se trata solo del rendimiento, sino del aprendizaje. No es un buen consejo aprender una práctica incorrecta.
Isaac
No es cierto que el "texto estático" se convierta en un echo, si lo quiere decir literalmente (lo que implica su idioma). El resultado es el mismo, pero los métodos son muy diferentes. Lo que llamas "texto estático" es, de hecho, escapar de PHP a HTML. Cuando esto sucede, el servidor comienza a enviar texto sin formato. No lo analiza a través de PHP, como lo haría con echo. Las implicaciones de rendimiento son probablemente pequeñas en cualquier circunstancia no artificial, pero la diferencia mecanicista es importante.
underscore_d
0

Una de las mejores características de PHP fue que está diseñado para integrarse en HTML. Por lo general, se usa para crear plantillas. Hace que su código sea más fácil de leer y mantener, ya que separa el código PHP del HTML.

Pero si solo está imprimiendo una página estática como "Hello World!" es una mala idea.

4ldrich
fuente
0

Para responder a su pregunta simplemente: dado su código de ejemplo, habrá poca o ninguna diferencia en el rendimiento. PHP se procesa a nivel de servidor / host, mientras que HTML es procesado por el agente de usuario / persona que mira su página web en su navegador. ¿Quién será más rápido? Difícil de determinar.

Estoy de acuerdo con otros diciendo que cada uno tiene sus fortalezas y debilidades y que pueden funcionar realmente bien juntos. PHP es programable y puede hacer cálculos y trabajar con variables. Por esa razón, todas mis páginas terminan siendo PHP y recurren a fragmentos de código HTML, plantillas como se mencionó e inserta variables para que mi HTML se vuelva dinámico.

En su ejemplo, podría encadenar el HTML en una sola declaración PHP de la siguiente manera:

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

Espero que eso ayude a aclarar un poco.

Michael Moriarty
fuente
0

Existen limitaciones en el uso de HTML dentro de PHP.

La mayoría de las veces tendrías tu HTML afuera. Crearía una página tal como lo haría si no estuviera usando PHP, luego agregaría el PHP en las áreas del documento donde lo necesita. Puede tener varios fragmentos de PHP dentro de un documento.

Trabajar con PHP Inside HTML tiene algunos ejemplos:

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

Purvi Barot
fuente
-1

En general, se considera una mala forma de generar código HTML desde PHP. Hay varias razones para esto, pero la principal es que es más fácil, especialmente a largo plazo, mantener el código si el código HTML y PHP está separado.

Es como HTML, CSS y Javascript; es mucho más fácil y práctico mantenerlo separado.

Técnicamente, sin embargo, no hay absolutamente ninguna diferencia en la forma en que imprime cosas. Para PHP son solo bytes seguidos.

Sverri M. Olsen
fuente
66
Eso hace una diferencia. <?php echo 'hello'; ?>se pasa a PHP. hellono se pasa a PHP. Todo lo que se pasa a PHP se convierte en bytecode y luego se interpreta. Esto lleva tiempo, potencia de procesamiento y electricidad.
Ted