2010-11-23 21 views
7

Vi un hilo acerca de omitir el cierre ?> en scripts PHP y me hizo preguntarme.php include y etiqueta de cierre

Tome este código:

foo.php

<?php 
echo 'This is foo.php'; 
include('bar.php'); 

Bar.php

<?php 
echo 'This is bar.php'; 

Si crea estas dos secuencias de comandos y ejecutarlos, salidas php:

This is foo.php 
This is bar.php 

(nueva línea añadida para la licencia artística antes de que alguien señala que fuera)

Así que, ¿cómo es que: baz.php

<?php 
echo 'This is foo.php'; 

<?php 
echo 'This is bar.php'; 

da como resultado un error de sintaxis predecible unexpected '<', cuando "incluye "hace justamente eso, o mejor dicho, mi entendimiento de incluir es que PHP solo tira el archivo en ese punto como si siempre hubiera estado allí.

¿Comprueba PHP las etiquetas de apertura e ignora las futuras si el archivo está incluido? ¿Por qué no hacer esto cuando hay dos conjuntos de etiquetas en una secuencia de comandos?

Gracias por cualquier aclaración. No es exactamente un tema importante, pero sería bueno entender PHP un poco más.

Respuesta

9

Si incluye un archivo, PHP cambia internamente a partir de análisis de modo literal (es decir, lo que lo hace normalmente en una etiqueta de cierre Eso es por qué esto funciona:

<?php 
include 'foo.php'; 
?> 

//foo.php 
<?php 
echo 'yo'; 
?> 

A pesar de que cuando inline se convertiría en

<?php 
<?php 
echo 'yo'; 
?> 
?> 

Debido interally se transforma en algo como esto (a título ilustrativo, en realidad, es probable que no se funden en realidad el contenido de los archivos, simplemente salta entre ellos)

<?php 
?> 
<?php 
echo 'yo'; 
?> 
<?php 
?> 

Se puede omitir el cierre?> Porque al final del archivo de inclusión, PHP cambia de nuevo al analizar el archivo incluyendo, regardles que sea el modo que es actualmente.

2

especulación personal:

Cuando se escribe include('bar.php');, el analizador lee el contenido fo bar.php y lo inserta en foo.php, al leerlo probablemente tiras de la puesta en <?php ya que reconoce todo el contenido de bar.php es código PHP , por lo tanto, el resultado no responde a un error. .

1

que podría ayudar a pensar en él como PHP no realmente incluyendo la otra página dentro de la primera, ya que en PHP no se crea internamente un solo archivo con todas las páginas incluidas dentro y luego se analiza eso.

Lo que hace es que analiza el primer archivo, encuentra include y luego deja de analizar el primer archivo y comienza a analizar el archivo incluido. Cuando el archivo incluido está listo, reanuda el análisis del archivo original donde se quedó. (Esto es bastante simplificado).

0

En algún lugar leí sobre omisión de abrir y cerrar etiquetas php.

El problema cuando hago esto es que mi editor no formatea los archivos como archivos php, sino como archivos de texto normales.

hasta ahora nunca he tenido un problema con ningún archivo de inclusión que tenga las etiquetas. No sé si es comportamiento depreciado para usar las etiquetas o no.

Cuestiones relacionadas