php - necesitan - la etiqueta<html> indica al navegador el fin de la página o cierre.
¿Por qué uno omitiría la etiqueta de cierre? (14)
Pros
- Sería lógico cerrar cualquier etiqueta abierta , como con otros idiomas. No solo las etiquetas X (HT) ML, sino también llaves, soportes ...
- Menos confuso para los principiantes .
Contras
- Evita el dolor de cabeza al agregar espacios en blanco sin darse cuenta después de la etiqueta de cierre, porque rompe el comportamiento de la función de encabezado () ... Algunos editors o clientes / servidores de FTP también cambian automáticamente el final de los archivos (al menos, es su configuración predeterminada)
- El manual de PHP dice que la etiqueta de cierre es opcional , y http://framework.zend.com/manual/en/coding-standard.php-file-formatting.html .
Conclusión
Yo diría que los argumentos a favor de omitir la etiqueta parecen más fuertes (ayuda a evitar un gran dolor de cabeza con el encabezado () + es la "recomendación" de PHP / Zend). Admito que esta no es la solución más "hermosa" que he visto en términos de coherencia de sintaxis, pero ¿qué podría ser mejor?
Sigo leyendo que es una mala práctica usar la etiqueta de cierre de PHP ?>
Al final del archivo. El problema del encabezado parece irrelevante en el siguiente contexto (y este es el único buen argumento hasta ahora):
Las versiones modernas de PHP establecen el indicador output_buffering en php.ini. Si el búfer de salida está habilitado, puede configurar los encabezados HTTP y las cookies después de generar html porque el código devuelto no se envía al navegador inmediatamente.
Cada libro de buenas prácticas y wiki comienza con esta "regla" pero nadie ofrece buenas razones. ¿Hay otra buena razón para omitir la etiqueta php final?
"¿Hay otra buena razón (aparte del problema del encabezado) para omitir la etiqueta php final?"
No desea generar inadvertidamente caracteres en blanco extraños al generar una salida binaria, datos CSV u otra salida que no sea HTML.
Además de todo lo que ya se ha dicho, voy a presentar otra razón que fue un gran dolor para nosotros para depurar.
Apache 2.4.6 con PHP 5.4 en realidad fallas de segmentación en nuestras máquinas de producción cuando hay espacio vacío detrás de la etiqueta de cierre de php
. Solo desperdicié horas hasta que finalmente strace el error con strace .
Aquí está el error que lanza Apache:
[core:notice] [pid 7842] AH00052: child pid 10218 exit signal Segmentation fault (11)
Bueno, hay dos maneras de mirarlo.
- El código PHP no es más que un conjunto de instrucciones de procesamiento XML y, por lo tanto, cualquier archivo con una extensión
.php
no es más que un archivo XML que se analiza en busca de código PHP. - PHP simplemente comparte el formato de instrucciones de procesamiento XML para sus etiquetas de apertura y cierre. En base a eso, los archivos con extensiones
.php
PUEDEN ser archivos XML válidos, pero no necesitan serlo.
Si cree que la primera ruta, todos los archivos PHP requieren el cierre de las etiquetas finales. Para omitirlos se creará un archivo XML no válido. Por otra parte, sin tener una declaración de apertura <?xml version="1.0" charset="latin-1" ?>
, No tendrás un archivo XML válido de todos modos ... Así que no es un problema importante ...
Si crees en la segunda ruta, eso abre la puerta a dos tipos de archivos .php
:
- Archivos que contienen solo código (archivos de biblioteca, por ejemplo)
- Archivos que contienen XML nativo y también código (archivos de plantilla, por ejemplo)
En base a eso, los archivos de solo código están bien para finalizar sin una etiqueta de cierre ?>
. Pero los archivos de código XML no están bien para finalizar sin un cierre ?>
Ya que invalidaría el XML.
Pero sé lo que estás pensando. Estás pensando qué importa, nunca vas a renderizar un archivo PHP directamente, así que a quién le importa si es un XML válido. Bueno, sí importa si estás diseñando una plantilla. Si es XML / HTML válido, un navegador normal simplemente no mostrará el código PHP (se trata como un comentario). Así que puedes burlarte de la plantilla sin necesidad de ejecutar el código PHP dentro de ...
No estoy diciendo que esto sea importante. Es solo una vista que no veo expresada con demasiada frecuencia, así que qué mejor lugar para compartirla ...
Personalmente, no cierro etiquetas en archivos de biblioteca, sino en archivos de plantilla ... Creo que es una preferencia personal (y una guía de codificación) basada más que nada en algo difícil ...
Bueno, yo sé la razón, pero no puedo mostrarlo:
Para 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.
Fuente: http://framework.zend.com/manual/en/coding-standard.php-file-formatting.html
Como mi pregunta se marcó como duplicado de esta, creo que está bien publicar por qué NO omitir la etiqueta de cierre ?>
Puede ser deseado por algunas razones.
- Con instrucciones de procesamiento completas Sintaxis (
<?php ... ?>
) La fuente PHP es un documento SGML válido, que se puede analizar y procesar sin problemas con el analizador SGML. Con restricciones adicionales también puede ser válido XML / XHTML.
Nada le impide escribir código XML / HTML / SGML válido. La documentación de PHP es consciente de esto. Extracto:
Nota: También tenga en cuenta que si está incrustando PHP dentro de XML o XHTML, necesitará usar las etiquetas <? Php?> Para cumplir con los estándares.
Por supuesto, la sintaxis de PHP no es SGML / XML / HTML estricto y usted crea un documento, que no es SGML / XML / HTML, al igual que puede convertir HTML en XHTML para que sea compatible con XML o no.
En algún momento es posible que desee concatenar fuentes. Esto no será tan fácil como hacer
cat source1.php source2.php
si se introducen inconsistencias al omitir las etiquetas de cierre?>
.Sin
?>
Es más difícil saber si el documento se dejó en modo de escape de PHP o en modo de ignorar de PHP (etiqueta PI<?php
puede haberse abierto o no). La vida es más fácil si constantemente deja sus documentos en modo de ignorar PHP. Es como trabajar con documentos HTML bien formateados en comparación con documentos con etiquetas anidadas, mal anidadas, etc.Parece que algunos editores como Dreamweaver pueden tener problemas con PI dejado abierto [1] .
De acuerdo con 2 , es preferible omitir la etiqueta de cierre si está al final del archivo por el siguiente motivo:
Si un archivo es código PHP puro, es preferible omitir la etiqueta de cierre de PHP al final del archivo. Esto evita que se agreguen espacios en blanco o nuevas líneas después de la etiqueta de cierre de PHP, lo que puede causar efectos no deseados porque PHP iniciará el búfer de salida cuando el programador no tenga intención de enviar ningún resultado en ese punto del script.
Es bastante útil no dejar el cierre ?>
En.
El archivo sigue siendo válido para PHP (no es un error de sintaxis) y, como lo dijo @David Dorward, permite evitar tener espacios en blanco / líneas de corte (cualquier cosa que pueda enviar un encabezado al navegador) después de ?>
.
Por ejemplo,
<?
header("Content-type: image/png");
$img = imagecreatetruecolor ( 10, 10);
imagepng ( $img);
?>
[space here]
[break line here]
no sera valido
Pero
<?
header("Content-type: image/png");
$img = imagecreatetruecolor ( 10, 10 );
imagepng ( $img );
será.
Por una vez, debes ser perezoso para estar seguro .
Es una recomendación de estilo de codificación para principiantes , bien intencionada y recomendada por el manual .
?>
Evitar?>
Sin embargo, solo soluciona un goteo de los encabezados comunes ya enviados (salida sin procesar, BOM , avisos, etc.) y sus problemas de seguimiento.PHP en realidad contiene algo de magia para comerse saltos de línea individuales después del token de cierre
?>
A pesar de que tiene problemas históricos , y deja a los recién llegados todavía susceptibles a editores escandalosos y desordenadamente en otros espacios en blanco después de?>
.Estilísticamente, algunos desarrolladores prefieren ver
<?php
y?>
Como etiquetas SGML / instrucciones de procesamiento XML, lo que implica la consistencia de equilibrio de un token cercano al final. (Lo que por cierto, es útil para la clase conjunta de dependencia incluye para suplantar ineficiente carga por archivo automática).Algo infrecuente, la apertura
<?php
se caracteriza como PHPs shebang (y completamente factible por binfmt_misc ), validando así la redundancia de una etiqueta de cierre correspondiente.Existe una obvia discrepancia entre las guías de sintaxis de PHP obligatorias
?>/n
y las más recientes (PSR-2) acordando omisión.
(Para el registro: Zend Framework, que postula una sobre la otra, no implica su superioridad inherente. Es una idea errónea que los expertos se sintieron atraídos por el público objetivo de las APIs difíciles de manejar).SCMs y los IDE modernos proporcionan soluciones integradas que, en su mayoría, alivian el cuidado de las etiquetas cercanas.
Desalentar el uso de la etiqueta ?>
Close simplemente retrasa la explicación del comportamiento de procesamiento básico de PHP y la semántica del lenguaje para evitar problemas poco frecuentes. Todavía es práctico para el desarrollo de software colaborativo debido a las variaciones de competencia en los participantes.
Cerrar variaciones de etiqueta
El regular ? > la etiqueta de cierre también se conoce como
T_CLOSE_TAG
, o por lo tanto, "token de cierre".Comprende algunas más encarnaciones, debido a que los PHP comen la nueva línea mágica:
? > / n (alimentación de línea Unix)
? > / r (retorno de carro, MACs clásicos)
? > / r / n (CR / LF, en DOS / Win)
Sin embargo, PHP no admite el combo de linebreak de Unicode (U + 0085).
Las primeras versiones de PHP tenían compilaciones de IIRC que limitaban un poco el agnosticismo de la plataforma (FI incluso se usaba simplemente como un marcador cercano), que es el origen histórico probable de la evitación de etiquetas cerradas.
A menudo se pasa por alto, pero hasta que PHP7 los elimine , el token de apertura
<?php
regular puede emparejarse de manera válida con el</script>
raramente usado como token de cierre impar .La " etiqueta de cierre rígido " no es ni una, solo inventó ese término por analogía. Sin embargo, desde el punto de vista
__halt_compiler
y de uso,__halt_compiler
debe reconocerse como un token cercano.__HALT_COMPILER(); ?>
Que básicamente tiene el tokenizador descartar cualquier código o secciones HTML simples a partir de entonces. En particular, los apéndices PHAR hacen uso de eso, o su combinación redundante con
?>
Como se muestra.Del mismo modo hace un
return;
vacíoreturn;
con poca frecuencia, sustituya en incluir scripts, lo que representa?>
con espacios en blanco finales no es efectivo.Luego hay todo tipo de variaciones de etiquetas de cierre suave / falso ; menos conocido y raramente usado, pero generalmente por tokens comentados :
Espaciado simple
// ? >
// ? >
Evadir la detección por tokenizer de PHPs.O los lujosos Unicode sustituyen
// ﹖﹥
(U + FE56 PEQUEÑA MARCA DE PREGUNTA, U + FE65 SOPORTE DE ÁNGULO PEQUEÑO) que puede comprender una expresión regular.
Ambos no significan nada para PHP , pero pueden tener usos prácticos para los conjuntos de herramientas externas que no tienen conocimiento de PHP o que son semi-conscientes. Una vez más, los scripts unidos por el
cat
vienen a la mente, con el resultado// ? > <?php
// ? > <?php
concatenaciones que en línea-conservan la sección anterior del archivo.
Por lo tanto, existen alternativas prácticas pero dependientes del contexto para una omisión imperativa de etiqueta cerrada.
Niñera manual de ?>
Cerrar etiquetas no es muy contemporáneo de ninguna manera. Siempre ha habido herramientas de automatización para eso (incluso si solo sed / awk o regex-oneliners). En particular:
phptags tag tidier
https://fossil.include-once.org/phptags/
Que generalmente se podría usar para --unclose
etiquetas php para códigos de terceros, o simplemente para solucionar cualquier problema de espacio en blanco / BOM (y todos):
-
phptags --warn --whitespace *.php
También maneja --long
conversión de etiquetas --long
etc. para la compatibilidad en tiempo de ejecución / configuración.
Hay 2 posibles usos de código php:
- Código PHP tal como definición de clase o definición de función
- Usar PHP como lenguaje de plantilla (es decir, en vistas)
en el caso 1. la etiqueta de cierre es totalmente inútil, también me gustaría ver solo 1 (una) etiqueta abierta de php y NO (cero) etiqueta de cierre en tal caso. Esta es una buena práctica, ya que hace que el código esté limpio y separe la lógica de la presentación. Para el caso de presentación (2.), algunos encontraron que es natural cerrar todas las etiquetas (incluso las procesadas por PHP), lo que conduce a la confusión, ya que el PHP tiene 2 casos de uso separados, que no deben mezclarse: lógica / cálculo y presentación
La razón por la que debe dejar fuera la etiqueta de cierre de php ( ?>
) Es para que el programador no envíe accidentalmente caracteres de nueva línea adicionales.
La razón por la que no debe dejar de usar la etiqueta de cierre de php es que causa un desequilibrio en las etiquetas de php y cualquier programador con la mitad de la mente puede recordar no agregar espacios en blanco adicionales.
Así que para tu pregunta:
¿Hay otra buena razón para omitir la etiqueta php final?
No, no hay otra buena razón para omitir las etiquetas php finales.
Terminaré con algunos argumentos para no molestarme con la etiqueta de cierre:
Las personas siempre pueden cometer errores, no importa lo inteligentes que sean. Adherirse a una práctica que reduce el número de posibles errores es (IMHO) una buena idea.
PHP no es XML. PHP no necesita adherirse a los estándares estrictos de XML para estar bien escrito y funcional. Si una etiqueta de cierre que falta le molesta, se le permite usar una etiqueta de cierre, no es una regla fija de una manera u otra.
No es una etiqueta ...
Pero si lo tienes, te arriesgas a tener espacio en blanco después de él.
Si luego lo usa como una inclusión en la parte superior de un documento, podría terminar insertando espacios en blanco (es decir, contenido) antes de intentar enviar encabezados HTTP ... lo cual no está permitido.
Si bien no puedo recordar ninguna otra razón, enviar encabezados antes del curso normal puede tener consecuencias de largo alcance. A continuación se muestran solo algunos de los que me vinieron a la mente en este momento:
Si bien las versiones actuales de PHP pueden tener un búfer de salida activado, los servidores de producción reales en los que implementará su código son mucho más importantes que cualquier máquina de desarrollo o prueba. Y no siempre tienden a seguir las últimas tendencias de PHP inmediatamente.
Es posible que tenga dolores de cabeza por la pérdida de funcionalidad inexplicable. Supongamos que está implementando algún tipo de pasarela de pago y redirigir al usuario a una URL específica luego de la confirmación exitosa por parte del procesador de pagos. Si se produce algún tipo de error de PHP, incluso una advertencia o un final de línea excedente, el pago puede permanecer sin procesar y el usuario aún puede parecer no facturado. Esta es también una de las razones por las que la redirección innecesaria es mala y, si se va a utilizar, se debe usar con precaución.
Puede obtener errores de "Carga de página cancelada" en Internet Explorer, incluso en las versiones más recientes. Esto se debe a que una respuesta AJAX / json include contiene algo que no debería contener, debido al exceso de final de línea en algunos archivos PHP, tal como lo encontré hace unos días.
Si tiene algunas descargas de archivos en su aplicación, también se pueden romper, debido a esto. Y puede que no lo note, incluso después de años, ya que el hábito específico de una descarga depende del servidor, el navegador, el tipo y el contenido del archivo (y posiblemente algunos otros factores con los que no quiero aburrirlo) .
Finalmente, muchos frameworks PHP, incluyendo Symfony , Zend y Laravel (no hay ninguna mención de esto en las pautas de codificación pero sigue el ejemplo) y el estándar PSR-2 (ítem 2.2) requieren la omisión de la etiqueta de cierre. El propio manual de PHP ( 1 , 2 ), Wordpress , Drupal y muchos otros programas de PHP, supongo, aconsejan hacerlo. Si simplemente se acostumbra a seguir el estándar (y configura PHP-CS-Fixer para su código), puede olvidar el problema. De lo contrario, siempre tendrás que tener el problema en mente.
Bono: algunos errores (actualmente uno) relacionados con estos 2 personajes:
- Incluso algunas bibliotecas conocidas pueden contener un exceso de finales de línea después de
?>
. Un ejemplo es Smarty, incluso las versiones más recientes de la rama 2. * y 3. * tienen esto. Entonces, como siempre, esté atento al código de terceros . Bonificación adicional: una expresión regular para eliminar terminaciones innecesarias de PHP: reemplace(/s*/?>/s*)$
con texto vacío en todos los archivos que contienen código PHP.
Si entiendo la pregunta correctamente, tiene que ver con el búfer de salida y el efecto que esto podría tener en las etiquetas de cierre / finalización. No estoy seguro de que sea una pregunta totalmente válida. El problema es que el búfer de salida no significa que todo el contenido se almacena en la memoria antes de enviarlo al cliente. Significa que parte del contenido es.
El programador puede vaciar el búfer a propósito, o el búfer de salida, ¿entonces la opción del búfer de salida en PHP realmente cambia la forma en que la etiqueta de cierre afecta la codificación? Yo diría que no es así.
Y tal vez es por eso que la mayoría de las respuestas volvieron al estilo personal y la sintaxis.