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

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

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

- все файлы PHP должны использовать конец строки Unix LF (перевод строки).

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

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

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

Например, если вы добавите после закрывающего тега ?> пробел, что не будет заметно в исходном коде, но в случае подключение данного файла с помощью конструкции 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 всегда писать закрывающий тег ?>.

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

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