2010-07-10 10 views
166

En algunos scripts veo que omiten escribir una etiqueta de cierre ?> para el script. ¿Por qué es y debería hacer esto también?¿Por qué algunas secuencias de comandos omiten la etiqueta PHP de cierre, '?>'?

(estoy seguro de que no lo han olvidado.)

+18

Muchos editores de texto antiguos siempre inyectan una nueva línea final. Y los espacios en blanco al final generaron errores de "encabezados ya enviados". El intérprete de PHP en realidad elude este problema, y ​​se come una SINGLE finalización y una nueva línea después de la etiqueta de cierre. Sin embargo, algunos programadores poco experimentados agregaron erróneamente dos o más líneas nuevas o espacios al final, pestañas después de?>. Es por eso que se considera una buena guía para novatos omitir el marcador de cierre de PHP. Sin embargo ** no es indicativo de un buen estilo de codificación **. – mario

+4

@mario "Sin embargo, no es indicativo de un buen estilo de codificación". -> No, en absoluto. Zend Framework (considerado el más robusto -y por lo tanto complejo- por algunos) y muchos otros profesionales y organizaciones en realidad prohíben agregar '?>' A archivos sin necesidad. [Zend Framework Coding Standard PHP File Formatting] (http://framework.zend.com/manual/en/coding-standard.php-file-formatting.html) –

+1

@battal También lo hacen muchos otros estilos de codificación. Podría contrarrestar las pautas de codificación de Horde o PEAR o CodeSniffer quejándose de las etiquetas omitidas. Pero al final, cada generalización es una mentira. Declarar cualquier método como estándar no lo convierte en la mejor práctica. Los casos de uso de la OMI y la competencia del desarrollador deberían ser determinantes aquí. (¡Pero sí, también se adhiere a una guía de codificación elegida !;) – mario

Respuesta

160

Bueno, omitir la etiqueta de cierre es solo una solución para evitar espacios en blanco y otros caracteres al final del archivo. Por ejemplo, cualquier char que se agregue accidentalmente detrás de la etiqueta de cierre generará un error al tratar de modificar la información del encabezado más adelante.

La eliminación de la etiqueta de cierre es una especie de "buena práctica" que hace referencia a muchas pautas de codificación.

+101

Algunos también considerarían esto como un defecto de idioma. –

+5

En algunos casos, ¿no es eso lo que se requiere? Las personas son responsables de limpiar los espacios en blanco después de la etiqueta de finalización. En algunos casos, alguien podría requerir la salida después de la etiqueta de finalización. –

+4

Es el [Zend] (http://framework.zend.com/manual/en/coding-standard.php-file-formatting.html) y [Drupal] (http://drupal.org/coding-standards #phptags) estándar para omitir la etiqueta '?>'. – Josh

14

Lo hacen para evitar el riesgo de tener espacios en blanco después de la etiqueta de cierre que puede dejar de cabeceras para trabajar.

Esto es, por supuesto, cierto para los archivos de solo PHP.

75

De PHP: Instruction Separation

La etiqueta de cierre de un bloque de PHP al final de un archivo es opcional, y en algunos casos omitiendo es útil cuando se utiliza include() o require(), por lo que los espacios en blanco no deseados no se produzcan en el fin de archivos, y aún podrá agregar encabezados a la respuesta más adelante. También es útil si usa buffering de salida, y no desea ver espacios en blanco adicionales no deseados al final de las partes generadas por los archivos incluidos.

+5

+ 1 ¡Para la declaración oficial de php.net! Lo cual me parece la fuente más relevante sobre este asunto. – Levit

5

Las versiones modernas de PHP configuraron la bandera output_buffering en php.ini. Si el almacenamiento en búfer de salida está habilitado, puede establecer encabezados y cookies HTTP después de la salida de HTML, ya que el código devuelto no se envía al navegador de inmediato.

¿Los ejemplos siguen siendo válidos en este contexto?

+0

Hum, no realmente - con el búfer de salida habilitado no hay necesidad de omitir las etiquetas de cierre imho. – dhh

6

CodeIgniter Framework sugiere omitir etiquetas de cierre para

"... puede causar la salida no deseada, los errores de PHP o páginas en blanco".

Lo puede leer here.

0
  1. Muestra espacio en blanco no deseado/página en blanco. Los encabezados HTTP no funcionan para esos espacios en blanco no deseados.
  2. Most La inyección de JavaScript se realiza al final del archivo. Mostrará un mensaje de error y rompe el código, el código JavaScript inyectado no se ejecuta.
+1

Sería muy malo si alguien pudiera inyectar JS al final del archivo ** PHP **. – Calmarius

+3

Sí lo será. pueden hacer muchas cosas con php, por qué deberían inyectarse JS. Yo era tonto entonces, y todavía soy uno ahora. Qué estaba pensando. –

30

php.net on PHP tags:

Si un archivo es código PHP puro, es preferible omitir el cierre de PHP etiqueta al final del archivo. Esto evita espacios en blanco accidentales o nuevas líneas que se agregan después de la etiqueta de cierre de PHP, que pueden causar efectos no deseados porque PHP iniciará el almacenamiento en búfer de salida cuando no hay intención del programador de enviar ningún resultado en ese punto en el script .

Cuestiones relacionadas