2008-10-25 12 views
25

El estándar de codificación de Zend Framework menciona lo siguiente:¿Cuáles son los argumentos EN FAVOR de las etiquetas de cierre de PHP para los archivos solo de PHP?

Para los archivos que solo contienen código PHP, la etiqueta de cierre ("?>") Nunca está permitida. PHP no lo requiere, y omitirlo evita la inyección accidental de espacios en blanco en la respuesta.

Sin embargo, yo recuerdo haber oído acerca de un tema (con herramientas o incluyendo tal vez?) Donde los archivos necesarios para tener una etiqueta de cierre.

¿Alguien sabe de algún problema (que no sea el problema del desarrollador de querer simetría) donde tendría que tener etiquetas de cierre o son generalmente una mala idea?

Respuesta

25

La eliminación de las etiquetas de cierre cuando se puede es realmente una mejor práctica. La razón es porque si tienes un carácter (incluso el espacio en blanco) fuera del?> En un archivo php, puede detener algo como los encabezados para dejar de funcionar si el personaje se envía al navegador antes de que se establezca el encabezado.

+0

Acepto que la etiqueta de cierre debe omitirse de los archivos de solo PHP cuando sea posible. Sin embargo, como otros han publicado, hay situaciones (varias) en las que no incluir una etiqueta de cierre hará que el código se rompa. – ZCHudson

+2

¿No es del todo cierto que cualquier espacio en blanco después del?> Es un problema. ¿Un único carácter de línea nuevo después del cierre?> No es un problema; será consumido por el analizador sintáctico y no se repetirá. Esto es por compatibilidad con MUCHOS editores de texto que requieren un salto de línea al final de todas las líneas. – thomasrutter

+1

El problema es que si está utilizando un editor Windoze, se inserta un , lo que hace que se emita la salida http. – dar7yl

0

Nuestra oficina funciona con aplicaciones de aprendizaje electrónico integradas en Flash y descubrimos desde el principio que si la etiqueta de cierre se omite de los scripts del lado del servidor, entonces rompe nuestro mecanismo de comunicación con las aplicaciones e-learnng.

Una advertencia a esto sería que nuestro proceso de depuración no lo intenté primero en un entorno simplificado para asegurarnos de que no era una combinación de las etiquetas de cierre faltantes y alguna salida errónea proveniente de algún otro script. ..

1

Utilizamos Drupal, que siempre omite la etiqueta de cierre, y nunca tuvo ningún problema debido a ello.

Como siempre funcionó para Drupal (y sabía por leer el manual que era opcional), una vez creé un archivo de configuración (que solo contenía código PHP) sin la etiqueta de cierre. Por alguna razón, no funcionó hasta que (a instancias de un compañero de trabajo) agregué la etiqueta de cierre. No intentamos descubrir la causa en ese momento.

Siempre he usado la etiqueta de cierre en el código que escribo; se ve más simétrico, conceptualmente "cierra" la etiqueta de apertura, y siempre tengo cuidado de no dejar ningún espacio en blanco adicional después de la etiqueta de cierre.

0

En respuesta a @ gabriel1836, las etiquetas de cierre en el lado del servidor son irrelevantes cuando se trata de aplicaciones Flash; lo relevante es la carga útil devuelta por el servidor en respuesta a una solicitud remota de la aplicación Flash. Omitir la etiqueta de cierre en archivos de solo PHP afectará esto solo para garantizar que la salida espuria no se devuelva antes de enviar los encabezados a su aplicación Flash.

En respuesta a @CesarB, a menos que pueda dar un ejemplo concreto y reproducible, todo lo que hace es propagar FUD. El manual de PHP es muy claro de que la etiqueta de cierre es opcional.

+0

¿Cómo se establece lo que me sucedió a FUD? (También vi varias veces que NO se usaba la etiqueta de cierre, en particular Drupal nunca la usa, y es por eso que traté de omitirla en ese archivo en particular, pensando que no marcaría la diferencia, incluso más desde que leí esa parte del manual.) – CesarB

+0

Y, de hecho, yo no creía que hubiera una diferencia que el desarrollador web tuviera que insistir varias veces para que yo intente agregar el?> antes que yo. Después de agregar la etiqueta de cierre, todo comenzó a funcionar de repente. – CesarB

+0

Del mismo modo, comencé a omitir la etiqueta de cierre después de haber leído acerca de las mejores prácticas de seguridad. Sin embargo, después de hacerlo, descubrimos que nuestras aplicaciones de e-learning comenzaron a fallar y que las etiquetas de cierre volvieron a solucionarse. –

1

siempre utilizo las etiquetas de cierre, simplemente no se ve bien sin ellas. Tampoco es una xml válida. Instrucciones de procesamiento sin ellos (no importa si lo único en el archivo es php)

+1

Creo que un archivo php no es un archivo xml ... No ejecute herramientas xml en un archivo php, ejecútelo a la salida del archivo php. – DGM

4

Podría considerar la etiqueta de apertura php para archivos php, como una especie de línea shebang (como #!/bin/bash), de esa manera, no necesita una etiqueta de cierre.

Seguimos el estándar ZF también, sin etiqueta de cierre para archivos php-only. Pero nunca escuché de ninguna herramienta que no pudiera analizar un archivo debido a la falta de una etiqueta de cierre, y hasta ahora no he tenido ningún problema para no usarla.

11

Si usa las etiquetas de cierre de PHP, entonces puede encontrar fácilmente los archivos que se han truncado accidentalmente (por ejemplo, no se han subido por completo).
Sin embargo, dicho problema debe corregirse haciendo que el sistema de archivos y las transferencias sean confiables en lugar de agregar etiquetas PHP "canarias" :)

Otra posible razón es que los estándares de codificación PEAR lo requieren. Lo requieren, porque lo requieren y no tiene permitido cuestionar los estándares de codificación PEAR.

+1

Excelentes puntos – Tom

3

Siempre escribo la etiqueta de cierre para los archivos php, y deliberadamente no la sigo con espacios o eol.

La norma implica que si se omite la etiqueta de cierre, se proporcionará implícitamente uno. Pero eso no exonera al desarrollador de escribir correctamente html/xml.

Y puede haber casos donde se combinan dos archivos fuera del procesamiento html/php, y una etiqueta faltante causaría una aflicción extrema.

+6

Omitir una etiqueta de cierre de php no tiene nada que ver con la escritura html/xml. PHP tampoco es uno de esos. – DGM

+1

Sin embargo, la etiqueta generalmente está incrustada en html, ya que la mayoría de las aplicaciones son para procesamiento web. PHP se define en el contexto de HTML, de lo contrario, no habría uso para las etiquetas. – dar7yl

+2

La pregunta contiene ** Para archivos que solo contienen código PHP **. Si insertaste tu código en HTML, no debes omitirlo, porque obviamente romperá tu código. Y un archivo PHP-only NO es html/xml. Simplemente no lo es. – Nanne

2

Siempre los pongo porque los veo como una llave de cierre de lujo, como cuando escribo condicionales y bucles pongo el par de llaves abiertas/cerradas antes de escribir código, lo hago con archivos PHP.

Ya sea "correcto" o no, semi-frecuentemente me encuentro convirtiendo archivos PHP "puros" en "no puros", y la etiqueta de cierre es extremadamente útil.

1

La comprobación de errores de codificación no funciona al concatar múltiples archivos. Uso el siguiente comando de shell para verificar si hay errores.

find . -name '*.php' | xargs cat | php -l 

Por supuesto, el siguiente comando todavía funciona (y muestra el nombre de archivo del archivo dañado)

find . -name '*.php' | while read filename; do php -l $filename | grep -v 'No syntax errors '; done 

Pero éste es mucho más lenta.

+1

Diría que la de abajo probablemente sería una mejor práctica; Sé que -l no hace mucha interpretación de los archivos en lugar de la verificación de sintaxis básica, pero supongo que estaría nervioso por algo en un archivo que afecte el estado del analizador para los archivos siguientes. – thomasrutter

+0

@thomasrutter Es cierto que debe usar el segundo (más lento). Hay varios problemas con el primero. Duplicar clases y funciones, por ejemplo. Pero considero definiciones duplicadas de clases y funciones de diseño de todos modos;) –

Cuestiones relacionadas