2010-11-23 5 views
7

Пила нить об исключении закрытия ?> в PHP-скриптах и ​​заставила меня задаться вопросом.php include и закрывающий тег

Возьмите этот код:

foo.php

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

bar.php

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

Если вы создаете эти два сценария и запускать их, PHP выходы:

This is foo.php 
This is bar.php 

(новая линия добавлена ​​для художественной лицензии, прежде чем кто-нибудь указывает, что из)

Итак, как же: baz.php

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

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

приводит к предсказуемой синтаксической ошибки unexpected '<', когда «включают в себя «делает именно это - точнее, мое понимание включения заключается в том, что PHP просто выгружает файл в этот момент, как если бы он всегда был там.

Проверяет ли PHP открытие тегов и игнорирование будущих, если файл включен? Почему бы не сделать это, если в одном скрипте есть два набора тегов?

Спасибо за любое разъяснение. Не совсем важная проблема, но было бы неплохо понять PHP еще немного.

ответ

9

Если включить файл, PHP внутренне переключается с разбора буквального режима (то есть то, что он обычно делает на закрывающий тег Вот почему это работает:

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

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

Несмотря на то, когда встраиваемый он станет

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

Поскольку interally он превращается в нечто вроде этого (в иллюстративных целях, на самом деле это, вероятно, не на самом деле объединить содержимое файлов, он просто прыгает между ними)

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

Вы можете опустить закрытие?>, Потому что в конце инклюднике, PHP переключается на разборе, включая файл, regardles в каком режиме он в настоящее время в.

2

Личные спекуляция:

Когда вы пишете include('bar.php');, анализатор считывает содержимое Ф.О. bar.php и вставляет его в foo.php, при чтении его вероятно полосой начального <?php, поскольку он признает все содержание bar.php является PHP-код , поэтому результат не приводит к ошибке. .

1

Это может помочь думать о нем, как PHP не фактически, включая другую страницу внутри первой, как и в PHP, не создает внутренний файл со всеми включенными страницами внутри, а затем анализирует его.

Что он делает, так это то, что он анализирует первый файл, находит include, а затем останавливает синтаксический анализ первого файла и начинает разбор входящего файла. Когда файл включен, он возобновляет синтаксический анализ исходного файла, где он был остановлен. (Это довольно немного упрощено.)

0

Я где-то читал об исключении как открывающих, так и закрывающих тегов php.

Проблема, когда я это делаю, заключается в том, что мой редактор не форматирует файлы в виде файлов php, а как обычные текстовые файлы.

до сих пор у меня никогда не было проблемы с любым включенным файлом с тегами. Я не знаю, было ли это обесцененным поведение использовать теги или нет.

Смежные вопросы