📚
#1 13.09.2025 PHP Basics

Расскажите о <?php ... ?> все что знаете, в том числе различные особенности.

Это канонические теги PHP для обрамления кода. Основные особенности: лишние пробелы после закрывающего тега и использование коротких тегов.

Подробнее
⚠️
Внимание! Этот текст был сгенерирован AI-ассистентом. Информация может содержать неточности и требует проверки.

Полный ответ:

1. Основное назначение: открывающий и закрывающий тег PHP

Конструкция <?php ... ?> — это канонические (стандартные) теги для обрамления PHP-кода внутри файла. Все, что находится между этими тегами, обрабатывается интерпретатором PHP. Все, что находится за их пределами, выводится как обычный текст/HTML.

Пример:

<!DOCTYPE html>
<html>
<body>
    <h1>Привет, это HTML!</h1>
    <?php
        // А это PHP
        echo "<p>Сгенерировано PHP в " . date('Y-m-d H:i:s') . "</p>";
    ?>
    <p>Снова HTML.</p>
</body>
</html>

2. Альтернативные (короткие) теги

Помимо стандартных, существуют другие стили тегов, но их использование требует осторожности.

  • Короткие теги (Short Open Tags): <? ... ?>
    • Могут быть отключены в конфигурации PHP (директива short_open_tag=Off). Их использование считается плохой практикой, так как приводит к несовместимости кода.
    • Серьезная особенность: если в файле, использующем короткие теги, нужно вывести XML-объявление <?xml version="1.0"?>, PHP-интерпретатор попытается обработать его как PHP-код и выдаст ошибку. Эту проблему можно обойти, используя, например, <?php echo '<?xml version="1.0"?>'; ?>.
  • Тег с echo (Short Echo Tags): <?= ... ?>
    • Это сокращение для <?php echo ... ?>.
    • Очень удобен для вывода переменных в HTML-шаблонах.
    • Важное отличие: В отличие от коротких тегов <? ... ?>, тег <?= ... ?> доступен всегда, начиная с PHP 5.4, независимо от настройки short_open_tag. Его использование безопасно и приветствуется для вывода данных.

    Пример:

    <p>Добро пожаловать, <?= $username ?>!</p>
    <!-- Аналогично <p>Добро пожаловать, <?php echo $username; ?>!</p> -->
    

3. Главные особенности

Нюанс №1: Лишние пробелы после закрывающего тега ?>

Это, пожалуй, самый коварный и частый источник ошибок.

  • Проблема: Если после закрывающего тега ?> есть перевод строки или пробелы, они будут отправлены в буфер вывода.
  • Почему это плохо? PHP часто используется для генерации контента, который требует отправки заголовков (HTTP Headers) до любого вывода. Cookies, редиректы (header('Location: ...')), сессии — всё это требует отправки заголовков. Если перед вызовом функции header() уже был вывод (даже один пробел), PHP выдаст фатальную ошибку “Cannot modify header information - headers already sent”.
  • BOM (Byte Order Mark): Невидимый символ в начале файла (в UTF-8) — тоже вывод. Используйте UTF-8 без BOM.

  • Пример ошибки:
    <?php
    // config.php
    $config = ['setting' => 'value'];
    ?> // Здесь после ?> есть ПЕРЕВОД СТРОКИ!
    
    <?php
    // index.php
    require 'config.php'; // Здесь уже неявно выводится тот самый перевод строки
    session_start(); // ИЛИ header('Location: /'); // ОШИБКА! Заголовки уже отправлены.
    ?>
    
  • Решение (Best Practice):
    1. В файлах, содержащих только PHP-код (классы, конфиги), НЕ закрывайте тег ?>. Это полностью избегает проблемы.
      <?php
      // config.php
      $config = ['setting' => 'value'];
      // Тег ?> в конце файла ОТСУТСТВУЕТ - проблема решена.
      
    2. Следите за кодировкой файлов (должна быть UTF-8 без BOM). BOM-маркер тоже является невидимым выводом и ломает отправку заголовков.

Нюанс №2: Смешивание логики и представления

Хотя технически можно писать огромные куски HTML, прерываясь на PHP-блоки для вставки переменных, это быстро приводит к spaghetti-коду.

  • Проблема: Код становится нечитаемым, сложным в поддержке и отладке.
  • Решение: Используйте паттерны типа MVC, отделяйте бизнес-логику от шаблонов представления. В шаблонах используйте по максимуму короткий echo-тег <?= и простые конструкции вроде foreach/if. Плохо:
    <div>
    <?php
    foreach ($users as $user) {
        if ($user->isActive()) {
            echo '<span class="active">' . htmlspecialchars($user->name) . '</span>';
        } else {
            echo '<span>' . htmlspecialchars($user->name) . '</span>';
        }
    }
    ?>
    </div>
    

    Лучше:

    <div>
        <?php foreach ($users as $user): ?>
            <span class="<?= $user->isActive() ? 'active' : '' ?>">
                <?= htmlspecialchars($user->name) ?>
            </span>
        <?php endforeach; ?>
    </div>
    

Нюанс №3: Неочевидный контекст

Новички не всегда понимают, что PHP — это препроцессор. Он “проходит” по файлу, выполняет код внутри тегов, а всё что вне — просто “печатает”. Любая сложная логика внутри HTML-вывода ухудшает читаемость.


4. Best Practices (Как правильно)

  1. Для файлов с чистым PHP-кодом не используйте закрывающий тег ?>. Это рекомендовано стандартами кодирования (например, PSR-12) и предотвращает проблемы с заголовками.
  2. Для вывода данных всегда используйте короткий echo-тег <?= ... ?>. Он читаем и безопасен.
  3. Избегайте коротких тегов <? ... ?>. Полностью откажитесь от них в новом коде для гарантии переносимости.
  4. Экранируйте выводимые данные. Всегда используйте htmlspecialchars() внутри <?= ... ?> при выводе в HTML-контекст, чтобы предотвратить XSS-уязвимости.
    <?= htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8') ?>
    
  5. Стремитесь к чистоте шаблонов. Выносите сложную логику в начало файла или, что еще лучше, в отдельные классы. В HTML-части используйте только простые циклы и условия.

Итог

1. Основное:

  • <?php ... ?> — стандартные теги для обрамления PHP-кода.
  • Всё вне тегов — выводится как есть (HTML/текст).

2. Альтернативные теги:

  • <? ... ?> (Short Open Tags): ЗЛО! Могут быть отключены в php.ini (short_open_tag). Не использовать!
  • <?= ... ?> (Short Echo Tags): ОК! Сокращение для <?php echo ... ?>. Доступен всегда (с PHP 5.4). Использовать для вывода.

3. ГЛАВНЫЙ ПОДВОДНЫЙ КАМЕНЬ:

  • “Headers already sent”: Любые пробелы/переводы строк после ?> выводятся в буфер и ломают отправку заголовков (header(), session_start(), setcookie()).
  • Решение: В файлах, содержащих ТОЛЬКО PHP-код (классы, конфиги) — НЕ ЗАКРЫВАТЬ тег ?> в конце файла. Это best practice.

4. Другие проблемы:

  • BOM (Byte Order Mark): Невидимый символ в начале файла (в UTF-8) — тоже вывод. Используйте UTF-8 без BOM.
  • Spaghetti-код: Смешивание сложной логики и HTML в одном файле. В шаблонах используйте только простые <?= ?>, foreach, if.

5. Best Practices:

  • Чистый PHP — без закрывающего ?>.
  • Для вывода — только <?= htmlspecialchars($var) ?>.
  • Для шаблонов — альтернативный синтаксис if|foreach|for: <?php foreach(...): ?> ... <?php endforeach; ?>.

Вывод

<?php ... ?> — это основа любого PHP-скрипта. Понимание нюансов работы с этими тегами, особенно опасности лишних пробелов и правильного использования <?= ?>, критически важно для написания чистого, надежного и безопасного кода. Главный вывод: в файлах только с кодом — не закрываем тег ?>, в шаблонах — используем <?= для вывода и избегаем сложной логики.