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.

Author: Harry Johnston, 2010-11-23

4 answers

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

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

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

Даже если при вставке он станет

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

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

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

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

 9
Author: Bart van Heukelom, 2010-11-23 09:53:23

Личные предположения:

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

 2
Author: Albireo, 2010-11-23 09:48:13

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

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

 1
Author: JJJ, 2010-11-23 10:06:17

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

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

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

 0
Author: anatak, 2015-01-19 03:29:19