ProfiPHPProfiPHP
  1. Главная
  2. Полезное в PHP
  3. Нужен ли закрывающий тег ?> в PHP?

Нужен ли закрывающий тег ?> в PHP?

Если после завершающего тега ?> нет никакого вывода, его можно опустить. Более того, стандарт кодирования PSR-2, который определяет форматирование РНР кода для распространяемых компонентов, в пункте 2.2 (Файлы) требует:
- все файлы PHP должны использовать конец строки Unix LF (перевод строки).

- все файлы PHP должны заканчиваться одной пустой строкой.

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

Без использования визуального редактора с подсветкой кода очень сложно заметить конечные пробельные символы после закрывающего тега ?>. Например, в стандартной сборке Far Manager пробелы незаметны:
Если пробел или любой другой символ после закрывающего тега ?> существует, он интерпретируются как часть тела ответа, и в случае подключение данного файла с помощью конструкции Include, он будет отправлен браузеру, что повлечет за собой отправку заголовков. После этого будет невозможно установить куки, или отправить заголовки, например с переадресацией.

Продемонстрируем все выше описанное на примере, для этого создадим файл с пробелом после ?>:
<?php
function example( ){ }
?>
И подключим его в такой вывод:
<?php
include('file.php');
header("Content-Type: text/html; charset=utf-8");
Нам отобразится ошибка:
Warning: Cannot modify header information - headers already sent by (output started at file.php:3) in file.php on line 3
Обязательно проверьте директиву Output_buffering, которая включает и отключает буферизацию вывода. Если данная директива включена, вы не увидите ошибок вида "Cannot modify header information - headers already sent".

Для себя можно сформулировать правило: никогда не заканчивать закрывающим тегом ?> в файле, в котором только код PHP. И наоборот: в файле, в котором смешанный PHP и HTML всегда писать закрывающий тег ?>.

Комментарии

Антон
Четко объяснил про директиву Output_buffering, потому что у меня ошибка не отображалась даже с пробелом в конце и я не мог понять суть данной рекомендации. Теперь все понятно, спасибо.

Добавить комментарий

Имя:
Текст комментария: