Por qué no deberíamos usar los "short tags" <? y <?=

Recientemente en una discusión en un foro uno de los tantos "expertos" que pueblan la comunidad PHP se mostraba contrario a mi explicación de qué cosas debía corregir en su código otro usuario.

Puntualmente la situación era la siguiente:

---Cita (Autor enriqueplace)---

[...]Sustituye los <?= por <?php echo, lo mismo que <? por <?php, está en desuso (por más que veas algunos ejemplos en el manual de Zend, eso es error de algún programador descarriado ;-))[...]

---Fin de Cita---


Y el usuario respondía:

"Che guru, fijate que lo que esta mal es usar el tag como "<?", pero no esta depcrecated el uso de "<?="

Chau guru."


En lo personal puedo aceptar (y me parece obvio) que desarrolladores duden y vuelvan a preguntar, pero no que contradigan sin fundamentos por el simple hecho que "ellos lo usan".

Dado que la discusión se trasladó al ámbito personal (la idea de esta persona era simplemente descalificar), nuestros aportes fueron borrados por el administrador del foro. Como considero que vale la pena la explicación sobre por qué no debemos usar los "short tags" o "etiquetas cortas" de apertura y cierre de PHP (en lo personal hace años evito esta práctica, pero he visto que algunos desarrolladores aún siguen usando).

Aquí la copia de la respuesta dada en el foro:

"Me remito al manual de PHP (que este capítulo está escrito hace mucho tiempo):

Sintaxis básica del lenguaje
http://www.php.net/manual/es/languag...ax.phpmode.php

Donde da ejemplos de todos los tags posibles para PHP, y el segundo dice:

2. <? echo ("esta es la más simple, una instrucción de procesado SGML \n"); ?>
<?= expression ?> Esto es una abreviatura de "<? echo expression ?>"


Este ejemplo hacer referencia al "formato corto de etiquetas" o "short tags", por lo cual el manual aclara:

"El método segundo no siempre está disponible. El formato corto de etiquetas está disponible con la función short_tags() (sólo PHP 3), activando el parámetro del fichero de configuración de PHP short_open_tag, o compilando PHP con la opción --enable-short-tags del comando configure. Aunque esté activa por defecto en php.ini-dist, se desaconseja el uso del formato de etiquetas corto."

Aunque esto pudiera no ser suficiente, el manual vuelve a reiterarlo un poco más abajo y ampliando otras situaciones donde además no es conveniente:

"Note: No se debe usar el formato corto de etiquetas cuando se desarrollen aplicaciones o bibliotecas con intención de redistribuirlas, o cuando se desarrolle para servidores que no están bajo nuestro control, porque puede ser que el formato corto de etiquetas no esté soportado en el servidor. Para generar código portable y redistribuíble, asegúrate de no usar el formato corto de etiquetas."

No recuerdo ahora (tampoco vale la pena buscarlo en este contexto) pero creo haber leído que en la versión 6 o 7 de PHP estos tags serán eliminados.

PD:
ahh, casi me olvido, en el manual de Zend Framework dice claramente "Short tags are never allowed" ("las etiquetas cortas nunca son permitidas"), de ahí mi expresión que "a pesar de ver ejemplos en el manual de Zend, no usarlos como excusa para decir "que no están en desuso / permitidos"".


Nota: Si se toman el tiempo para investigar un poco verán que las fuentes pueden ser contradictorias con sus sugerencias: el manual de PHP dice no usarlos, la guía de buenas prácticas del wiki de los desarrolladores de Zend Framework recomienda por un lado tampoco usarlos, pero por otro lado sí (en determinadas condiciones), y luego se pueden ver ejemplos de código en los dos sentidos (con y sin "short tags").

Claramente la respuesta válida no es "los short tags se pueden usar porque PHP lo permite usar" (de esa forma validaríamos muchas prácticas erróneas) o porque simplemente "yo lo uso hace tiempo" o porque "nunca leí nada que dijera lo contrario" (y ni siquiera han consultado el manual oficial).

En conclusión

Mi recomendación es que no uses los "short tags", usa siempre <?php y <?php echo, solo tienes que escribir unos caracteres más y usas una sintaxis que no te trae problemas en ningún contexto y es la versión "oficial" de los tags de PHP (lo otro es una abreviación).

19 comentarios:

Dennis Cohn Muroy dijo...

Completamente de acuerdo con lo mencionado. Hace poco asistía a una reunión de comunidades PHP en donde efectivamente se recomendó no solo dejar de usar los short tags "< ?" y "< ?="; sino que a su vez no hacer uso del "< %".

Como bien indicas, en el PHP6 serán eliminados, así mismo, el PHP6 hará uso de un control E_STRICT de forma predeterminada, por lo que será necesario darle una revisión a los códigos actuales para mitigar los problemas de migración que pudieran presentarse más adelante.

Saludos.

enrique_place dijo...

Estimado Dennis:

Gracias por tu aporte, la verdad que tenía idea haber leído en algún documento sobre la eliminación en PHP6, pero no recordaba exactamente en cual ;-)

Sobre el tag "<%", pero que peor, nunca se me hubiera ocurrido a menos que fuera programador ASP ;-)

Ashrey dijo...

He usado etiquetas cortas en la parte de las platillas php, mas por escribir menos (y dicho sea de paso se ve mas estético, xq quita el feo 'echo' de la instrucción, jejeje), pero la razón de desaconsejar su uso es porque por ejemplo si trabajamos con xml la parte de la declaración es ">?xml version='1.0'?>" entonces en cuando escribimos ">?" es inicio de una instrucción php o una declaración xml? He ahí el problema. Lo que si me gustaria es que se permitiera el uso de ">?php=$foo;?>" al muy estilo ASPero.

Rubén Moraleda dijo...

No sé porqué le dan tantas vueltas a éste tema, con perl y una expresión regular se puede reemplazar en cuestión de segundos, no la posteo aqui completa porque no me deja meter el código en el comentario, pero os la podeis imaginar:

perl -pi -w -e 's/buscar/reemplazar/g;' *.php

Saludos.

enrique_place dijo...

Estimado Rubén:

El problema va más allá de cuan fácil es corregir los fuentes.

Para qué hacer las cosas mal si se pueden hacer bien? y qué mejor post que uno que sirve para aclarar dudas en un tema que puede ser confuso?

meigallo dixital dijo...

Justo esta semana pasado tuvimos flame en la oficina sobre lo mismo. ;) La gente se acostumbra a smarty (sobre todo) y pretende luego acortar todo :P

Rubén Moraleda dijo...

Hola Enrique:

Discúlpame si no fuí suficientemente claro, me refería al tema de las precocupaciones al migrar a PHP6 para los que usan short tags, cuando la solución es bien sencilla.

En cuanto a si usarlos o no, en mi humilde opinión personal, que cada programador haga lo que crea más conveniente y lo que les sea más cómodo, siempre que sea consciente de las implicaciones y problemas derivados que comentas, eso es lo verdaderamente importante.

Lo que si me gustaría apuntar es que usar short tags no está mal, una cosa es que no sea recomendable y otra muy distinta que esté mal.

Ojo, no estoy a favor del uso de short tags, pero lo que si estoy seguro es que no creo que los programadores que usan short_tags sean programadores descarriados, tal vez un poco flojos, pero no descarriados :D

Javier dijo...

Aquí hay un problema, y entiendo porque el usuario del foro te contesto eso. Aunque en el manual de php esta <?= utilización esta comentada como short, el PHP no lo trata como tal.

Me voy a explicar, como tú has dicho, para que funcionen los short tags tienes que activar la directiva de php indicada sino no te funcionaran las paginas. Pero si tienes desactivada esa directiva solo dejan de funcionar estas <? y no <?= , así que hay que un erro importante, o del que escribe el manual o de la directiva de php. Ya que da confusión que desactivando la directiva de short tags y te siguen funcionando entonces será que no es un short tags ? Da a confusión.
Un Saludo

enrique_place dijo...

Que tal Rubén:

Ahora te entiendo un poco más, está más claro tu punto, aunque no comparto desde mi visión que los programadores hagan "lo que les queda más cómodo", seguir los estándares ahorra mucho tiempo y dinero en cualquier proyecto. Por eso apoyo la filosofía del lenguaje Java, que generalmente no tienes mas de una forma de hacer las cosas que deben ser simples y ocuparnos solo por las complejas (ej, no creo que cada programador haga su propia indentación, hay una sola, etc, no como en PHP, que cada uno sigue "su estándar", lo cual lo anula como estándar).

Y lo de descarriados, lo dije por el mensaje confuso que puede dejar la misma documentación de Zend, que en algunos lugares lo usen y en otros no, y luego parte de la documentación dice una cosa y en otro lado otra, y en el manual de PHP otra ;-)

No por lo otro, lo de fondo es discutir con "tontos" que por gritar más fuerte creen que tienen razón.

Gracias por tu aporte ;-)

Rubén Moraleda dijo...

Que tal Enrique,

Tu bien sabes enrique la cantidad de personas que intervienen en el proceso de documentación y desarrollo del framework por lo que creo que es algo que podemos pasarles por alto :p

Si embargo si estoy muy de acuerdo en cuanto a lo de los estándares, es muy molesto tener que revisar el código de alguien y ver que utilizan otro sistema para identar, o utilizan nomenclatura sin sentido para variables, funciones, clases, es un infierno... Personalmente, prefiero mil veces que usen los short tags, que tiene muy fácil solución, a que hagan esto que te comento :D

Por cierto, en tu penúltimo párrafo no entiendo a qué te refieres.

Saludos.

JUCA dijo...

Creo que para responder siempre es bueno argumentar con algo.
Y tu Enrique siempre lo haces eso es importante.
Cuando escribes es garantia de que te has tomado la molestia de investigar si otra persona piensa distinto lo mas prudente es que se documente y de ahi plantear una discusion.
Pasando al tema esto ya lo conocia pero recien te consulte de porque no habia que cerrar el tag de archivos que solo contienen codigo php a lo que de igual forma argumentaste muy bien y todo quedo muy claro que son recomendaciones de Zend.

nAcho dijo...

Estoy de acuerdo en que no hay que dejar de refrescar las buenas prácticas, por más básicas que sean (como yo creo que es esta). Pero, por favor, superemos esto de una vez por todas, que quede en lo archivos de los blogs y los foros para que sean consultados por los que recién se meten a aprender.

José Zanni dijo...

La guía de código PHP que tienen en CodeIgniter también desaconseja usar los short tags.

Nuevos Programadores dijo...

La verdad que las shot tags se me hacen desagradables a la vista, por 2 cosas: primero, por costumbre, desde que empecé con php me pareció que si eran opcionales no era muy bueno usarlas y segundo, porque una vez tuve que editar un código ajeno que usaba short tags porque al migrar de servidor se vino el mundo abajo y como hacía poco que trabajaba con php y nunca había tocado ese código me llevó un rato notar que el código estaba lleno de short tags y el servidor no las admitía.

Ese último punto fue el que causó mi alergia a las short tags.

El tag de asp nunca se me ocurrió usarlo porque me parece que no corresponde, soy un programador muy mañoso y que gusta de las cosas "puras" por así decirlo.

Ashrey dijo: (...) por escribir menos (...)

Creo que un programador que no quiere escribir tiene que dedicarse a otra cosa, por ejemplo ser usuario de GeneXus... además te ahorrás 3 o 4 caracteres.

ramonono | Maeghith dijo...

Resumiendo, el único motivo que aportan los manuales es portabilidad.

A mi no me parece mal usarlos en la parte de una aplicación web que más se puede beneficiar de ellos: las vistas, que es algo que tampoco es que necesiten mucha portabilidad. Salvo migracion de un servidor a otro con peores condiciones (como la experiencia que comenta 'Nuevos programadores' y entendiendo como peores condiciones el no tener la capacidad de cambiar la configuración del servidor) una vista no se suele reutilizar de un proyecto a otro al contrario que las bibliotecas de un framework que tienen que ser portables impepinablemente. Ahora, que para eso están los sistemas de plantillas (por eso, imagino, el manual de PHP lo desaconseja, y el del Zend FW lo prohibe en la parte que ha citado Enrique, pero el mismo manual de Zend dice que "bueno, tampoco es tan grave" en otra parte donde da opciones para usarlos en las Zend_view [cap. 53.1.4 Short Tags with View Scripts]).

Nuevos programadores dijo:
Creo que un programador que no quiere escribir tiene que dedicarse a otra cosa, por ejemplo ser usuario de GeneXus... además te ahorrás 3 o 4 caracteres.

No se trata de "no querer escribir y ya", se trata de no querer escribir código redundante, que no aporta nada a la lógica de la aplicación, y que tampoco hace que sea más legible (personalmente veo a Java en un extremo de eso [excesivamente 'tecleoso'] y a Perl en el otro [excesivamente 'atajoso'], PHP y otros están por ahí en medio).

Diego dijo...

Que dolor de cabeza cuando los ejemplos no me funcionaban. Y todo porque tenía "< ?" en vez de "< ?php"

Me acabo de enterar lo de forosdelweb y maestrosdelweb. Que bronca me agarré.

Dante dijo...

Esta bien ir acostumbrandose a la regla de NO usar short tags. Ahora, siendo un poco sarcastico ( ;) ) con Enrique, creo que el PD era la razon principal y toda la explicacion anterior era PD, jejejej

dobeto dijo...

A los que no somos profesionales nos ha pasado el volvernos locos sin saber porqué y dar vueltas por multitud de foros (que es donde más se aprende) :-D Ya nunca volví a usar los short-tags.

Alrik dijo...

¿Quereis saber un motivo de por qué no hay que usar short_tags?

< ?xml version="1.0" encoding="iso-8859-1"? >
....

¿Os suena?

Entradas populares