International PHP Conference Berlin 2025

Выход из режима HTML-разметки

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

<p>PHP-интерпретатор проигнорирует разбор PHP-кода в этом параграфе, а текст отобразится в браузере.</p>
<?php echo 'А эту строку файла — разберёт.'; ?>
<p>Этот параграф PHP тоже не станет анализировать как PHP-код и отправит в браузер.</p>
Это работает предсказуемо, поскольку когда PHP-интерпретатор встречает закрывающие теги ?>, он просто начинает выводить всё, что находит, — за исключением перевода строки, который идёт сразу за закрывающим тегом, как описывает раздел «Разделение инструкций», — пока не встретит другой открывающий тег, если только закрывающий тег не встретился в середине условной инструкции, тогда интерпретатор определяет результат условия, прежде чем решить, что пропустить. Следующий пример показывает это поведение.

Структуры с условиями.

Пример #1 Продвинутый выход из режима HTML-разметки с условиями

<?php if ($expression == true): ?>
Это отобразится, если выражение истинно.
<?php else: ?>
Иначе отобразится это.
<?php endif; ?>
В этом примере PHP пропустит блок, для которого условие не выполняется, даже если блок указали за пределами открывающего и закрывающего тегов; PHP пропустит блоки по условию, поскольку PHP-интерпретатор пропустит блоки внутри условия, которое не выполняется.

Для вывода больших блоков текста выход из режима разбора PHP-кода часто эффективнее отправки текста конструкциями echo или print.

Замечание:

В XML- или XHTML-документы PHP-код встраивают внутри тегов <?php ?>, чтобы документы соответствовали стандартам.

Добавить

Примечания пользователей 3 notes

up
404
quickfur at quickfur dot ath dot cx
14 years ago
When the documentation says that the PHP parser ignores everything outside the <?php ... ?> tags, it means literally EVERYTHING. Including things you normally wouldn't consider "valid", such as the following:

<html><body>
<p<?php if ($highlight): ?> class="highlight"<?php endif;?>>This is a paragraph.</p>
</body></html>

Notice how the PHP code is embedded in the middle of an HTML opening tag. The PHP parser doesn't care that it's in the middle of an opening tag, and doesn't require that it be closed. It also doesn't care that after the closing ?> tag is the end of the HTML opening tag. So, if $highlight is true, then the output will be:

<html><body>
<p class="highlight">This is a paragraph.</p>
</body></html>

Otherwise, it will be:

<html><body>
<p>This is a paragraph.</p>
</body></html>

Using this method, you can have HTML tags with optional attributes, depending on some PHP condition. Extremely flexible and useful!
up
77
ravenswd at gmail dot com
15 years ago
One aspect of PHP that you need to be careful of, is that ?> will drop you out of PHP code and into HTML even if it appears inside a // comment. (This does not apply to /* */ comments.) This can lead to unexpected results. For example, take this line:

<?php
$file_contents
= '<?php die(); ?>' . "\n";
?>

If you try to remove it by turning it into a comment, you get this:

<?php
// $file_contents = '<?php die(); ?>' . "\n";
?>

Which results in ' . "\n"; (and whatever is in the lines following it) to be output to your HTML page.

The cure is to either comment it out using /* */ tags, or re-write the line as:

<?php
$file_contents
= '<' . '?php die(); ?' . '>' . "\n";
?>
up
27
sgurukrupa at gmail dot com
10 years ago
Although not specifically pointed out in the main text, escaping from HTML also applies to other control statements:

<?php for ($i = 0; $i < 5; ++$i): ?>
Hello, there!
<?php endfor; ?>

When the above code snippet is executed we get the following output:

Hello, there!
Hello, there!
Hello, there!
Hello, there!
To Top