2010-11-23 13 views
7

Sah einen Thread über das Schließen der ?> in PHP-Skripts und habe mich wundernd.php include und closing tag

diesen Code nehmen:

foo.php

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

bar.php

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

Wenn Sie diese beiden Skripte erstellen und ausführen sie, php-Ausgänge:

This is foo.php 
This is bar.php 

(neue Zeile hinzugefügt für künstlerische Lizenz, bevor jemand das weist darauf hin)

Also, wie kommen: baz.php

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

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

Ergebnisse in einem vorhersagbaren Syntaxfehler unexpected '<', wenn „enthalten "Genau das - oder besser gesagt, mein Verständnis von Include ist, dass PHP die Datei zu diesem Zeitpunkt einfach ablegt, als ob sie schon immer da gewesen wäre.

Sucht PHP nach öffnenden Tags und ignoriert zukünftige, wenn die Datei enthalten ist? Warum nicht, wenn zwei Tags in einem Skript vorhanden sind?

Danke für jede Klarstellung. Nicht gerade ein wichtiges Thema, aber es wäre nett, PHP ein wenig mehr zu verstehen.

Antwort

9

Wenn Sie eine Datei enthalten, intern PHP wechselt von zu Literalmodus Parsing (dh, was es normalerweise der Fall ist auf einem End-Tag Deshalb funktioniert das:

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

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

obwohl Selbst wenn inlined wäre es

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

Weil interally es in so etwas wie dies verwandelt hat (zu illustrativen Zwecken, in Wirklichkeit ist es wahrscheinlich nicht wirklich den Inhalt der Dateien zusammenführen, es springt nur zwischen ihnen)

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

können Sie das Schließen weglassen?>, Denn am Ende der Datei enthalten, schaltet PHP zurück einschließlich Datei zu parsen, regardles welchem ​​Modus es ist derzeit in.

2

Persönliche Spekulation:

Wenn Sie include('bar.php'); schreiben, der Parser den Inhalt fo bar.php liest und fügt es in foo.php, wenn es wahrscheinlich Lesen Streifen der Start <?php da es PHP-Code alle Inhalte von bar.php ist erkennen Das Ergebnis führt daher nicht zu einem Fehler. .

1

Es könnte daran denken helfen, PHP nicht eigentlich einschließlich der anderen Seite innerhalb der ersten, wie in PHP intern erstellt nicht eine einzige Datei mit allen enthaltenen Seiten innerhalb und dann parse das.

Was es tut, ist, dass es die erste Datei analysiert, findet include und hört dann auf, die erste Datei zu analysieren, und beginnt, die enthaltene Datei zu analysieren. Wenn die enthaltene Datei fertig ist, wird die ursprüngliche Datei, in der sie unterbrochen wurde, erneut analysiert. (Dies ist jedoch ein wenig vereinfacht.)

0

Ich irgendwo gelesen über das Auslassen sowohl Öffnen und Schließen von PHP-Tags.

Das Problem, wenn ich dies tue, ist, dass mein Editor die Dateien nicht als PHP-Dateien, sondern als normale Textdateien formatiert.

bis jetzt hatte ich nie ein Problem mit einer Include-Datei, die die Tags hat. Ich weiß nicht, ob es abgeschriebenes Verhalten ist, die Tags zu verwenden oder nicht.