Подтвердить что ты не робот

PHP end tag "?>"

У меня было интересное явление с тегом PHP end. У меня был php файл, который был выполнен с помощью вызова Ajax. В php файл был включен файл библиотеки php с различными функциями. Когда эта библиотека была включена, в php-ответ включался пучок пустых строк. Когда я удалил конец тега из библиотеки, это остановилось. Может ли кто-нибудь объяснить мне, что здесь происходит?

4b9b3361

Ответ 1

Это хорошо документировано. Из руководства PHP:

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

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

Ответ 2

Это основная функция PHP: в отличие от других языков вам нужно пометить PHP-код специальным тегом (обычно <?php), потому что все остальное считается литералом:

This is not PHP
<?php

echo 'This is PHP' . PHP_EOL;

?>
This is not PHP either
D:\tmp>php test.php
This is not PHP
This is PHP
This is not PHP either

Хотя в руководстве упоминается HTML, PHP не знает и не заботится о том, какой тип содержимого находится за пределами его тегов.

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

This is not PHP
<?php

echo 'This is PHP' . PHP_EOL;

This is not PHP either
D:\tmp>php test.php
PHP Parse error:  syntax error, unexpected 'is' (T_STRING) in D:\tmp\borrame.php on line 6

Пустые строки - это особый случай, потому что они действительны и почти невидимы почти на всех языках (PHP, HTML, CSS, JavaScript...), поэтому они часто остаются незамеченными.

После удаления тега ?> литерные пустые строки исчезли из вывода script, потому что они стали частью кода PHP (и, как таковые, они начали игнорироваться).

Конечно, пустые строки игнорируются PHP, но не обязательно тем, что вы генерируете, что, как я уже сказал, не обязательно должно быть HTML: это может быть изображение, документ PDF, электронная таблица Excel. Бегущие строки Bogus можно легко избежать, не закрывая последний блок PHP, когда он является последней частью файла.