Даже те, кто скромно разбирается в PHP, знают, что код должен быть заключен в специальные теги <? Php и?>.
Вы также можете знать, что код PHP может быть разделен с помощью менее используемых тегов <script language = «php»> и </ script>. Если short_open_tag включен в php.ini, вы можете использовать <? и?> хотя их следует избегать, если вы встраиваете код в XHTML или XML. Наконец, вы можете использовать теги <% и%> в стиле ASP, если asp_tags установлен в php.ini.
Однако, если ваш файл содержит только PHP — и не содержит экранированного HTML-кода — закрывающий тег?> Не является обязательным. Многие разработчики утверждают, что ненужный код должен быть удален, но есть еще одна причина, по которой вы можете рассмотреть удаление закрывающего тега. Предположим, у нас есть библиотека функций PHP с именем library.php :
<?php// library functionsfunction DoStuff() { // code}?>
Библиотека включена в наш основной входной файл index.php :
<?phpinclude('library.php');// write a headerheader('X-Demo: Example');// set cookiesetcookie('TestCookie', 'Example');?><p>End of index.php file.</p>
К сожалению, при загрузке этой страницы появляются 2 предупреждения с одним и тем же сообщением:
Предупреждение: невозможно изменить информацию заголовка - заголовки уже отправлены
Или хуже, если вы могли бы работать в реальной среде, где предупреждения были отключены, и сообщение не появляется. В любом случае, ни заголовок, ни cookie не установлены, и это может вызвать критические проблемы приложения. Что вызывает ошибку? Вы не можете видеть это, но после закрывающего символа есть пробел?> В файле library.php. Когда он находится в верхней части index.php, это пространство отправляется в браузер как содержимое страницы вместе со всеми необходимыми заголовками HTTP. После отправки первого блока содержимого невозможно установить дополнительные заголовки или файлы cookie.
Современные версии PHP устанавливают флаг output_buffering в php.ini. Это буферизует ваш вывод HTML и отправляет его, когда ваш PHP-код был обработан или когда буфер достигает предела (например, 4096 байт). Вы также можете использовать PHP ob_start()
ob_end_flush()
Даже если вы уверены, что буферизация всегда включена, рекомендуется установить заголовки HTTP и файлы cookie перед отправкой содержимого страницы.
Ваше PHP-приложение может включать в себя десятки файлов библиотек или классов. Как вы можете себе представить, может быть трудно найти дополнительные пробелы, возврат каретки или любые другие символы после закрытия?>. К счастью, это легко исправить. Если вы пропустите закрытие?> Во всех ваших файлах кода только для PHP, ошибка просто не может произойти — парсер будет игнорировать пробелы. Это решение, но вы бы его использовали? Это заставляет меня чувствовать себя немного грязным … Вы уже опускаете закрывающий тег?>? Примешь ли ты практику? Или это просто неправильно?