PHP включает и закрывает тег - PullRequest
8 голосов
/ 23 ноября 2010

Увидел поток об исключении закрывающих ?> в 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"делает именно это - или, скорее, я понимаю, что include включает в себя то, что PHP просто выдает файл в тот момент, как если бы он всегда был там.

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

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

Ответы [ 4 ]

10 голосов
/ 23 ноября 2010

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

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

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

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

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

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

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

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

2 голосов
/ 23 ноября 2010

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

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

1 голос
/ 23 ноября 2010

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

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

0 голосов
/ 19 января 2015

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...