🔎

Закриваючий тег ?> в PHP

Я новачок у вивченні PHP. Після перегляду вихідного коду деяких CMS помітив відсутність закриваючого тега ?>. Після моїх тестувань ніякої різниці не помітив. Поясніть доступними словами для чого так роблять?
<?php
// код
// закриваючий тег відсутній
php
4 відповіді
  • Дмитро
    Якщо після закриваючого тегу ?> немає жодного виводу інформації, його можна опустити. Більш того, стандарт кодування 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 завжди писати закриваючий тег.
  • Ігор
    Закриваючий тег PHP-блоку в кінці файлу не є обов'язковим, і в деяких випадках його опускання досить корисно, наприклад, при використанні include або require, оскільки небажані пропуски не залишаться в кінці файлу і ви все ще зможете додати http-заголовки після підключення до відповіді сервера. Це також зручно при використанні буферизації виведення, де також небажано мати пробіли в кінці частин відповіді, згенерованого підключеними файлами.
  • Антон
    І так і так буде правильно. Закриваючі теги обов'язкові для html файлів, що містять php код. Але, якщо у вас файл тільки з php кодом, то закриваючий тег ставити не обов'язково.

    Якщо вдаватися в подробиці, то для виведення php, серверу потрібно не просто віддати браузеру файл "як є" (як у випадку з html) а викликати php інтерпретатор. PHP інтерпретатор буде зчитувати (і виконувати) код до тих пір поки не зустріне закриваючий тег або поки не зустріне кінець файлу. Так що можете використовувати і не використовувати закриваючі теги.
  • Рома
    Якщо файл містить лише код PHP, можна не писати закриваючий тег. Це допомагає уникнути добавлення випадкових символів пробілу та переводу рядка після закриваючого тегу PHP, які можуть бути причиною небажаних проблем.