¿Es una mala práctica usar la etiqueta <? = En PHP?

190

Me he encontrado con esta etiqueta PHP <?= ?>recientemente y soy reacio a usarla, pero pica tanto que quería tener tu opinión sobre ella. Sé que es una mala práctica usar etiquetas cortas <? ?>y que deberíamos usar etiquetas completas <?php ?>, pero ¿qué pasa con esta <?= ?>:?

Ahorraría algo de tipeo y sería mejor para la legibilidad del código, IMO. Entonces, en lugar de esto:

<input name="someVar" value="<?php echo $someVar; ?>">

Podría escribirlo así, que es más limpio:

<input name="someVar" value="<?= $someVar ?>">

¿Usar este operador está mal visto?

marco-fiset
fuente
11
El problema con este tipo de preguntas es que es muy obstinado. Allí "técnicamente" no es una forma correcta o incorrecta. Algunos argumentan a favor, algunos en contra, todo es preferencia. Así que al final depende de ti.
mseancole
Evite la etiqueta de cierre en cualquier forma, si puede, es decir, el archivo contiene solo código php (no html, etc.). Si tiene una etiqueta de cierre, cualquier carácter posterior se enviará al navegador (para una aplicación web), lo que puede ocasionar problemas muy difíciles de depurar. Para más información: stackoverflow.com/a/4453835/49560
dharm0us
No relacionado con la opinión: tenga cuidado porque echoconduce muy fácilmente a XSS, y debería confiar mejor en el método de eco dedicado al contexto (es decir, tener un function html($x) { echo htmlentities($x,...); }y un en html($someVar);lugar de echo $someVaro usarlo echo json_encode($x);para el contexto JS). Esto hace que las <?=etiquetas sean una mala práctica porque significa que se ha escapado HTML del contenido de la variable en otro lugar, y por lo que ese otro lugar debe saber mágicamente que esta variable tiene que ser escapado HTML porque se repite en el contexto HTML.
Xenos

Respuestas:

211

Historia

Antes de que el tren de información errónea salga demasiado de la estación, hay un montón de cosas que debe comprender sobre las etiquetas cortas de PHP.

El problema principal con las etiquetas cortas de PHP es que PHP logró elegir una etiqueta ( <?) que fue utilizada por otra sintaxis, XML .

Con la opción habilitada, no pudo generar la salida sin formato de la declaración xml sin obtener errores de sintaxis:

<?xml version="1.0" encoding="UTF-8" ?>

Este es un gran problema cuando considera cuán común es el análisis y la administración de XML.

¿Qué hay de <?=?

Aunque <?causa conflictos con xml, <?= no lo hace . Desafortunadamente, las opciones para activarlo y desactivarlo estaban vinculadas short_open_tag, lo que significaba que para obtener el beneficio de la etiqueta de eco corta ( <?=), tenía que lidiar con los problemas de la etiqueta abierta corta ( <?). Los problemas asociados con la etiqueta abierta corta fueron mucho mayores que los beneficios de la etiqueta de eco corta, por lo que encontrará un millón y medio de recomendaciones para short_open_tagdesactivar, lo que debe hacer .

Con PHP 5.4, sin embargo, la etiqueta de eco corta se ha vuelto a habilitar por separado de la short_open_tagopción. Veo esto como un respaldo directo de la conveniencia de <?=, ya que no hay nada fundamentalmente malo en ello en sí mismo.

El problema es que no puede garantizar que tendrá <?=si está intentando escribir código que podría funcionar en una gama más amplia de versiones de PHP.

ok, ahora que todo eso está fuera del camino

Deberías usar <?=?

diagrama de flujo sobre si usar o no la etiqueta de eco corta

zzzzBov
fuente
71
No estoy de acuerdo con tu diagrama ágil. La respuesta correcta es 99.99% SÍ porque la mayoría de los entornos de producción están configurados para usar etiquetas cortas. Suponiendo que sopló y eliminar <?=en el futuro se puede arreglar en menos de un minuto, no importa cuántos miles de archivos usan, que acaba de hacer una búsqueda en todo el proyecto y reemplazar de <?=para <?php echo . Mi respuesta es no te preocupes y solo úsala , los beneficios superan en gran medida las consecuencias. <?=ya no se considera una etiqueta corta, el mismo Rasmus Lerdorf lo hizo muy comprometido.
dukeofgaming
32
@dukeofgaming, ¿de dónde obtiene sus datos sobre entornos de producción configurados para usar etiquetas cortas? Deshabilitarlos es una de las configuraciones más comúnmente sugeridas de las que he oído hablar, solo superada por deshabilitar las comillas mágicas. También tendría absolutamente cero sentido tener un entorno de desarrollo que sea diferente de la producción.
zzzzBov
44
Las etiquetas cortas se habilitaron de forma predeterminada hasta 5.3 php.net/manual/en/ini.core.php#ini.short-open-tag , la mayoría de los servicios de alojamiento que conozco lo respaldaron sin problemas y esta fue una de las razones por las que el marco de trabajo de Kohana solía alentarlo. <?=siempre estará encendido ( stackoverflow.com/a/6064813/156257 ) y la mayoría de las veces solía estar encendido. Puede demostrar que estoy equivocado al consultar con su host si: están deshabilitados y usan PHP <5.3 y si no permiten que los usuarios anulen la configuración o si la solicitan de manera especial; Si todo lo anterior es falso, no hay de qué preocuparse <?=.
dukeofgaming
66
No le preocupa que <?=se eliminen, y yo tampoco. Otros podrían estarlo, y si lo están, no tienen que usarlo <?=. Algunas personas tienen miedo irracional de usar ciertas características del lenguaje ( como dejar etiquetas de cierre en php ).
zzzzBov
8
Ese es precisamente mi punto: no hay necesidad de preocuparse . Solo ponía "¿Estás preocupado?" --si -> "Adelante y úsalos, no hay que preocuparse". También parece que estás dando a entender que dejar las etiquetas de cierre es una mala práctica, que no lo es.
dukeofgaming
29

Desempolvando mi sombrero PHP

Definitivamente preferiría el uso de <?= $someVar ?>los más detallados echo(simplemente preferencias personales). El único inconveniente de AFAIK es para los usuarios que ejecutan versiones anteriores a la 5.4.0, en cuyo caso short_open_tagdeben estar habilitados en php.ini .

Ahora dicho esto, si su proyecto no es SO, entonces es un punto discutible. Si es así, documentaría el hecho de que short_open_tags debe estar habilitado o usaría la más portátil de las dos soluciones.

Demian Brecht
fuente
1
Nitpick: aunque PHP 5.4 <?=no lo afecta short_open_tag, lo <?sigue siendo y si tiene la costumbre de usar etiquetas de formato corto, es bastante fácil olvidar qué es compatible con qué versión.
Yannis
77
@YannisRizos Es bueno distinguirlo <?=como "Estoy enviando una variable ahora" para uso de estilo de plantilla y <?phpcomo "Estoy ejecutando mucho código ahora". Sugeriría nunca usar <?, pero eso <?=y ambos <?phpestán bien.
Izkata
2
+1 porque Rasmus Lerdorf respalda la etiqueta abreviada <? =. Vi una de sus charlas en el PHP 5.4 (que pronto se lanzará). Es por eso que desde PHP 5.4.0 la etiqueta <? = Siempre está disponible. He visto una gran cantidad de código anterior a PHP 5.4 en el que la etiqueta <? = Se usa en la Vista de una aplicación MVC pero <? Php ...?> Se usa en los archivos sin vista.
programador
@ Jason Eso no es lo que digo. "Rasmus respalda a foo" no es un argumento, "Rasmus respalda a foo por esta y esa razón", pero lo es.
Yannis
2
@Yannis Rizos "Sin embargo, Rasmus respalda a foo por esta y esa razón". Gracias por la tutela, pero mi razonamiento fue desde que Rasmus Lerdorf lo respalda, siendo el creador del lenguaje y aún influyendo en el desarrollo de PHP, se hicieron cambios para que la etiqueta <? = Siempre esté disponible. Esto es lo que debería haber agregado a mi comentario original "Por lo tanto, la práctica de usar <? = En las vistas probablemente se generalizará aún más". Dang, necesitaré verificar tres veces mis comentarios por ahora en ... puntos ...
programador
21

Definitivamente, debe intentar evitar las etiquetas de formato corto, ya sea <?o no <?=.

La razón técnica principal es la portabilidad, nunca puede estar seguro de que las etiquetas de formato corto funcionarán para cada configuración, ya que se pueden desactivar, busque la short_open_tagdirectiva. Pero siempre puede estar absolutamente seguro de que la forma larga funcionará en todas partes.

Ahorraría algo de tipeo y sería mejor para la legibilidad del código, IMO.

Eso también es un mal hábito. Realmente no puedo decirte qué encuentras más legible, pero estoy febrilmente en contra de usar la legibilidad del código como una excusa para ahorrarte un par de pulsaciones de teclas. Si le preocupa la legibilidad, debe optar por un motor de plantillas, esto:

<input name="someVar" value="{someVar}">

es mucho más legible de sus dos ejemplos.

Por último, vale la pena señalar que las etiquetas de formato corto son desalentadas explícitamente por los principales proyectos de PHP, por ejemplo, PEAR y Zend Framework .

Yannis
fuente
14
+1 para plantillas. -1 para portabilidad. Es un lenguaje del lado del servidor. Los desafíos en los que debe centrarse para un servidor son cosas como la escalabilidad y la seguridad. Sería una increíblemente mala idea invertir tiempo seria en asegurarse de que se ejecutan en múltiples plataformas ... (por si acaso!) ...
riwalk
3
@ Stargazer712 Hm? Lo único que debe hacer es usar el estándar <?phpy, en echolugar de <?y <?=, ¿lo considera como un tiempo serio? ¿Y qué sucede cuando mueve su proyecto a un servidor donde, por alguna razón, las etiquetas cortas están deshabilitadas?
Yannis
13
@ Yannis: esos pocos personajes pueden no parecer mucho, pero en mi opinión, suman mucho ruido.
Kevin Cline
8
Creo que debería mencionarse que el propósito original de PHP era ser un lenguaje de plantilla . Agregar otro motor de plantillas (más hinchazón) encima de PHP no hace flotar mi atunero. Simplemente siga las buenas prácticas (algunos buenos consejos están aquí stackoverflow.com/questions/62617/… ) cuando codifique PHP mezclado con HTML y estará listo.
programador
2
@Yannis Rizos Sí, debería mencionarse porque las personas nuevas en PHP podrían pensar que están obligadas a usar el motor de plantillas [whizbang] en sus proyectos PHP sin considerar el uso de PHP puro. Debería hacer solo procesamiento de texto en Perl , tal vez no, pero creo que a estas alturas Perl es bastante bueno en el procesamiento de texto, al igual que PHP y plantillas.
programador
15

La documentación de PHP dice claramente que puede usar etiquetas de eco cortas de forma segura:

5.4.0 The tag <?= is always available regardless of the short_open_tag ini setting.

Aunque esto es para PHP versión 5.4 y superior, pero al menos todos deberían usar este. Los preferiría solo con fines de plantilla.

Hexodus
fuente
10

Razones para usar etiquetas cortas:

  • Son mas cortos.

Razones para no usar etiquetas cortas:

  • Presentan un problema de configuración más: si bien controla el servidor la mayor parte del tiempo en un contexto profesional, si planea lanzar su código al público en general, las etiquetas cortas pueden romperse de manera irreparable para las personas que lo usan, por ejemplo, en un alojamiento compartido .
  • Hacen que sea demasiado fácil soltar casualmente cadenas no desinfectadas en su salida. Esto da miedo porque puede introducir vulnerabilidades XSS. Si bien las etiquetas largas no hacen nada directamente para evitar esto, sí le indican al programador que tal vez lo que están haciendo no es lo correcto, y deberían comenzar a usar un sistema de plantillas que maneje automáticamente la codificación HTML en este momento . Producir cadenas dinámicas con etiquetas largas es doloroso, lo cual es algo bueno (educativo).
tdammers
fuente
Esa es la respuesta para aceptar IMO, incluso las plantillas no harán que todo sea seguro para XSS (los datos del usuario en el atributo src de un script siempre serán inseguros) y no sé si el mecanismo de la plantilla conoce el contexto de eco adecuado; ¿Qué pasa si la variable PHP termina en un contenido de etiqueta de script? ¿En un SVG incrustado en el HTML?
Xenos
@Xenos claramente eso depende del sistema de plantillas en cuestión, y no hay una bala de plata; pero la mayoría de ellos reducen la superficie del error y la cantidad de escenarios en los que se requiere diligencia manual (la fuente más importante de errores de seguridad). "No poner contenido dinámico en etiquetas de script" es más fácil de seguir (y auditar) que "asegúrese de que todo el contenido dinámico esté codificado en HTML correctamente en todas partes".
tdammers
4

Creo que la <?=versión es una práctica buena / aceptable, siempre que solo la use para la salida final de variables y evite cualquier llamada a funciones o lógica ternaria que no esté directamente relacionada con la presentación de los datos.

Ciertamente es mucho mejor que en <? echo($x); ?>todas partes.

A largo plazo, es posible que desee buscar motores de plantillas como Smarty .

Darien
fuente
3
Smarty alguna vez fue el motor de plantillas, pero en este momento es un desastre anticuado e hinchado, y realmente debes mantenerte alejado.
Yannis
2

A partir de PHP 7.4, el campo de juego cambia un poco:

<? ?> está oficialmente en desuso y se eliminará en PHP 8.0.

PHP RFC: desaprobar PHP Las etiquetas abiertas cortas indican explícitamente que <?= ?>no se ve afectado. Esto indicaría (según yo, no el RFC) que no se desaconseja su uso.

Etienne Bruines
fuente
-3

Para ser honesto, creo que hacer eco de un resultado cualquiera que sea el método (antiguo o nuevo) es algo bastante obsoleto mientras MVC celebra 33 años.

Diría que sí, esta es una buena práctica encapsular los datos entrantes del servidor (php) dentro de un documento XML y procesarlos en su capa aplicativa / cliente, lo que le ahorra incluso la idea de usar dicha etiqueta.

sebas
fuente
1
En realidad, MVC celebra 33 años, se describió por primera vez en diciembre de 1979 en este documento .
Yannis
sí, todavía estoy en el 2000, mi error :-)
sebas
1
um ... Templar ... ¿es la plantilla obsoleta? ¿Las plantillas y MVC son mutuamente excluyentes?
Tim Seguine