php включает и закрывающий тег
Увидел тему об опущении закрывающего ?>
в PHP-скриптах и заставил меня задуматься.
Возьмите этот код:
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 '<'
, когда "включить" делает именно это - или скорее, мое понимание include заключается в том, что PHP просто сбрасывает файл в этот момент, как если бы он всегда был там.
Проверяет ли PHP наличие открывающих тегов и игнорирует ли будущие теги, если файл включен? Почему бы не сделать это, когда в одном скрипте есть два набора тегов?
Спасибо за любые разъяснения. Не совсем важный вопрос, но было бы неплохо немного больше понять PHP.
4 answers
Если вы включаете файл, PHP внутренне переключается с синтаксического анализа в буквальный режим (т.Е. То, что он обычно делает с закрывающим тегом. Вот почему это работает:
<?php
include 'foo.php';
?>
//foo.php
<?php
echo 'yo';
?>
Даже если при вставке он станет
<?php
<?php
echo 'yo';
?>
?>
Потому что внутри он преобразуется во что-то вроде этого (для иллюстрации, на самом деле он, вероятно, на самом деле не объединяет содержимое файлов, он просто прыгает между ними)
<?php
?>
<?php
echo 'yo';
?>
<?php
?>
Вы можете опустить закрытие?> потому что в конце включить файл, PHP переключается обратно на анализ включаемого файла, независимо от того, в каком режиме он находится в данный момент.
Личные предположения:
Когда вы пишете include('bar.php');
, анализатор считывает содержимое bar.php
и вставляет его в foo.php
, при чтении , вероятно, удаляет начальный <?php
, поскольку он распознает, что все содержимое bar.php
является кодом PHP, следовательно, результат не приводит к ошибке.
Может быть полезно думать об этом как о PHP, а не как о на самом деле, включая другую страницу внутри первой, так как в PHP внутренне не создается один файл со всеми включенными страницами внутри, а затем анализировать это.
Что он делает, так это анализирует первый файл, находит include
, а затем прекращает разбор первого файла и начинает разбор включенного файла. Когда включенный файл завершен, он возобновляет анализ исходного файла с того места, где он был прерван. (Это довольно немного упрощено хотя.)
Я где-то читал об опущении как открывающих, так и закрывающих тегов php.
Проблема, когда я это делаю, заключается в том, что мой редактор форматирует файлы не как php-файлы, а как обычные текстовые файлы.
До сих пор у меня никогда не было проблем с каким-либо включаемым файлом с тегами. Я не знаю, является ли использование тегов устаревшим поведением или нет.