Закриваючий тег ?> в PHP
Я новачок у вивченні PHP. Після перегляду вихідного коду деяких CMS помітив відсутність закриваючого тега ?>. Після моїх тестувань ніякої різниці не помітив. Поясніть доступними словами для чого так роблять?
<?php
// код
// закриваючий тег відсутній
Якщо вдаватися в подробиці, то для виведення php, серверу потрібно не просто віддати браузеру файл "як є" (як у випадку з html) а викликати php інтерпретатор. PHP інтерпретатор буде зчитувати (і виконувати) код до тих пір поки не зустріне закриваючий тег або поки не зустріне кінець файлу. Так що можете використовувати і не використовувати закриваючі теги.
- всі файли PHP повинні закінчуватися одним порожнім рядком.
- закриваючий тег ?> має бути опущений у файлах, що містять лише PHP.
Зустрівши будь-який символ, інтерпретатор РНР має на увазі, що починається виведення НТТР документа та формування попередніх йому НТТР заголовків завершено. Тому пізніші спроби надіслати НТТР заголовки будуть завершуватися помилкою. Якщо завершальний тег не використовується, такі помилки виключаються як клас.
Без використання візуального редактора з підсвічуванням коду дуже складно помітити кінцеві символи пробілів після кінцевого тега ?>. Наприклад, у стандартній збірці Far Manager проміжки непомітні.
Якщо пробіл або будь-який інший символ після закриваючого тега ?> існує, він інтерпретується як частина тіла відповіді, і в разі підключення даного файлу за допомогою конструкції Include, він буде відправлений браузеру, що потягне за собою відправлення заголовків. Після цього неможливо встановити куки, або надіслати заголовки, наприклад, з переадресацією.
Продемонструємо все вище описане на прикладі, для цього створимо файл із пробілом після ?>:
І підключимо його до такого виводу:
Нам з'явиться помилка:
Для себе можна сформулювати правило: ніколи не закінчувати закриваючим ?> тегом у файлі, в якому тільки код PHP. І навпаки: у файлі, в якому змішаний PHP і HTML завжди писати закриваючий тег.