Почему некоторые скрипты опускают закрывающий тег PHP, '?>'?

В некоторых сценариях я вижу, что они пропускают запись закрывающего тега ?> Для сценария. Почему я должен делать это тоже?

(Я уверен, что они не забыли это.)

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

Удаление закрывающего тега является «хорошей практикой», относящейся ко многим руководствам по кодированию.

От PHP: Разделение инструкций

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

php.net на тегах PHP :

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

Они делают это, чтобы избежать риска иметь пробелы после закрывающего тега, которые могут помешать работе заголовков.

Это, конечно, верно для файлов только для PHP.

CodeIgniter Framework предлагает опустить закрывающие теги для

«… может вызвать нежелательный вывод, ошибки PHP или пустые страницы».

Вы можете прочитать его здесь .

Современные версии PHP устанавливают флаг output_buffering в php.ini . Если буферизация вывода включена, вы можете установить заголовки HTTP и файлы cookie после вывода HTML, потому что возвращенный код не сразу отправляется в браузер.

Допустимы ли примеры в этом контексте?

  1. На нем отображается нежелательная пробел / пустая страница. Заголовки HTTP не работают для нежелательных пробелов.
  2. Большинство инъекций JavaScript производится в конце файла. Он покажет сообщение об ошибке и разломит код, код введённого JavaScript не будет выполнен.