2010-11-23 4 views
7

J'ai vu un fil sur l'omission de la fermeture ?> dans les scripts PHP et m'a demandé.php include et la balise de fermeture

Prenez ce code:

fichier foo.php

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

bar.php

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

Si vous créez ces deux scripts et de les exécuter, sorties php:

This is foo.php 
This is bar.php 

(nouvelle ligne ajoutée pour la licence artistique avant tout le fait que sur)

Alors, comment se fait: baz.php

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

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

résultats dans une erreur de syntaxe prévisible unexpected '<', lorsque « comprend "fait juste cela - ou plutôt, ma compréhension d'include est que PHP saute simplement le fichier à ce moment-là comme s'il avait toujours été là.

Est-ce que PHP vérifie l'ouverture des balises et ignore les balises futures si le fichier est inclus? Pourquoi ne pas le faire quand il y a deux ensembles de balises dans un script?

Merci pour toute précision. Pas vraiment un problème important mais serait bien de comprendre PHP un peu plus.

Répondre

9

Si vous incluez un fichier, PHP interne passe l'analyse syntaxique en mode littéral (à savoir ce qu'il fait normalement sur une balise de fermeture Voilà pourquoi cela fonctionne:

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

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

Même si quand inline il deviendrait

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

Parce que interally il est transformé en quelque chose comme ça (à titre d'exemple, en réalité, il ne fusionne pas probablement en fait le contenu des fichiers, il saute juste entre eux)

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

Vous pouvez omettre la fermeture?> Parce qu'à la fin du fichier include, PHP revient à l'analyse du fichier, y compris, regardles de ce mode, il est actuellement.

2

spéculation personnelle:

Lorsque vous écrivez include('bar.php');, l'analyseur lit le contenu fo bar.php et il insère dans foo.php, lors de la lecture probablement bandes INITIALES <?php car il reconnaît tout le contenu de bar.php est du code PHP donc le résultat n'indique pas une erreur. .

1

Il pourrait aider à penser comme PHP pas effectivement y compris l'autre page à l'intérieur du premier, comme en PHP ne crée pas en interne un seul fichier avec toutes les pages incluses à l'intérieur, puis analyser cela.Qu'est-ce que cela fait est qu'il analyse le premier fichier, trouve include, puis arrête l'analyse du premier fichier et commence l'analyse du fichier inclus. Lorsque le fichier inclus est terminé, il reprend l'analyse du fichier d'origine où il s'est arrêté. (Ceci est cependant un peu simplifié.)

0

J'ai lu quelque part à propos de l'omission des balises php d'ouverture et de fermeture. Le problème lorsque je fais cela est que mon éditeur ne formate pas les fichiers en tant que fichiers php mais en tant que fichiers texte réguliers.

jusqu'à présent, je n'ai jamais eu de problème avec un fichier d'inclusion contenant les balises. Je ne sais pas si c'est un comportement déprécié d'utiliser les tags ou non.