Одна из причин, по которой люди избегают закрывающего тега?>, - это избегать "заголовков уже отправили ошибку" из-за разрывов строк или других невидимых символов после тега?>.
Вполне допустимо опускать закрывающий тег. Одна из причин для этого - избегать нежелательных пробелов, которые могут конфликтовать с заголовками.
На самом деле особо нечего сказать об этой проблеме.
PHP-файл, заканчивающийся так:
<php
//code
?>
фактически заставит PHP отправлять заголовки клиенту из-за пробела после закрывающего тега ?>
, который вы можете увидеть, если выделите блок кода. . Пробелы или разрывы строк в конце файлов можно легко пропустить, а их сложно отследить.
После отправки заголовков невозможно делать такие вещи, как изменение строки состояния или типа содержимого.
Поскольку закрывающий тег подразумевается в конце файла, вы можете просто опустить закрывающий тег для файлов, содержащих только код PHP. Если вы это сделаете, любые завершающие пробелы будут рассматриваться как пробелы в коде, а не как пробелы в содержимом, и будут игнорироваться.
Используется для предотвращения отправки заголовков во включенных файлах. Например, если ваш включенный файл содержит закрывающий тег PHP и пробел на нем или символ новой строки, этот файл отправляет заголовки, и вы не можете изменять информацию заголовков в будущем.
Я обычно использую закрывающие теги, но слышал об этом стиле кода при использовании Code Igniter. Я думаю, что, не используя закрывающий тег, вы избегаете возможных проблем с символами "пробела", которые могут привести к нарушению ваших сессий, что может вызвать ошибку "заголовки уже отправлены".
Из руководства ( http://www.php.net/manual/en/language.basic-syntax.instruction-separation.php ):
Примечание: Закрывающий тег блока PHP в конце файла является необязательным, и в некоторых случаях его отсутствие полезно при использовании include() или require(), так что нежелательные пробельные символы не будут появляться в в конце файлов, и вы по-прежнему сможете добавить заголовки в ответ позже. Это также удобно, если вы используете буферизацию вывода и не хотели бы видеть добавленные ненужные пробельные символы в конце частей, сгенерированных включенными файлами.