Menu

Heredoc и Nowdoc в PHP: многострочные строки

Heredoc в PHP это многострочная строка, которая начинается с <<<EOT и заканчивается на EOT; переменные в ней подставляются, как в строке в двойных кавычках. Nowdoc, <<<'EOT', сохраняет текст точно как написано. Синтаксис, правила отступов, интерполяция массивов и объектов, HTML-шаблоны.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Heredoc это многострочная строка. Начните её с <<<EOT, напишите текст на следующих строках и закончите на EOT; в отдельной строке. Переменные внутри подставляются, как в строке в двойных кавычках.

Идентификатор (здесь EOT) состоит из буквы или подчёркивания, за которыми идут буквы, цифры или подчёркивания. Обычно выбирают имя, которое говорит, что это за текст: HTML, SQL, TEXT. Некоторые редакторы, например PhpStorm, подсвечивают тело как соответствующий язык, если имя HTML или SQL.

HTML-шаблон на heredoc

Heredoc это самый понятный способ записать блок HTML со значениями внутри: разметка сохраняет свою форму, и ничего не нужно экранировать. Результат это HTML, поэтому редактор показывает его на вкладке Page.

Две детали в этом блоке: элемент массива обёрнут в фигурные скобки, {$product['name']}, а знак доллара перед ценой экранирован как \$. Измените название или добавьте тег и запустите снова.

Значения от пользователей нужно экранировать перед вставкой в HTML. Зачем и как, смотрите в htmlspecialchars.

Nowdoc: текст без интерполяции

В nowdoc идентификатор записывается в одинарных кавычках: <<<'EOT'. Внутри ничего не подставляется, поэтому знаки доллара и обратные слеши остаются как написано. Используйте его для примеров кода, регулярных выражений и любого текста, где есть $.

Отступ закрывающей метки

Начиная с PHP 7.3 закрывающую метку можно писать с отступом, и этот отступ удаляется из каждой строки тела. Так heredoc внутри функции или if может следовать отступам кода, а пробелы не попадут в строку.

Строка с json_encode делает результат видимым посимвольно: из каждой строки удалено 8 пробелов, потому что закрывающая TEXT; имеет отступ 8.

Строка тела с отступом меньше, чем у закрывающей метки, вызывает ошибку разбора:

$html = <<<HTML
  <p>Hello</p>
    HTML;
PHP Parse error:  Invalid body indentation level (expecting an indentation level of at least 4) in /home/index.php on line 3

Массивы, объекты и вызовы методов внутри heredoc

Heredoc подчиняется тем же правилам, что и двойные кавычки. Простые переменные работают сами по себе; для ключей массива в кавычках, вложенных массивов, свойств и вызовов методов используйте фигурные скобки.

Heredoc как аргумент функции

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

Частая ошибка: нет точки с запятой или лишний текст после метки

Закрывающий идентификатор должен быть написан точно так же, как открывающий (с тем же регистром), а то, что идёт за ним в этой строке, должно иметь смысл как PHP. EOT; завершает инструкцию, EOT, продолжает список аргументов. Буква или цифра сразу после метки (EOTX;) прячет её, строка тянется до конца файла, и PHP сообщает syntax error, unexpected end of file. Обратная ловушка это строка тела, которая начинается с идентификатора, за которым идёт пробел или знак препинания, например EOT is the marker: она досрочно завершает строку, а остаток читается как PHP (syntax error, unexpected identifier "is"). Выбирайте идентификатор, который никогда не встречается в начале строки текста, например HTML для разметки или SQL для запроса.

Часто задаваемые вопросы

Что такое heredoc в PHP?

Способ записать многострочную строку без кавычек: начните с <<<EOT и переноса строки, напишите текст и закончите на EOT; в отдельной строке. Переменные внутри подставляются точно так же, как в строке в двойных кавычках, а " и ' можно использовать свободно.

Чем heredoc отличается от nowdoc?

Heredoc (<<<EOT) подставляет переменные и обрабатывает escape-последовательности, как строка в двойных кавычках. Nowdoc (<<<'EOT', идентификатор в одинарных кавычках) не делает ни того, ни другого и сохраняет каждый $ и обратный слеш как написано, как строка в одинарных кавычках.

Можно ли делать отступ у закрывающей метки heredoc?

Да, начиная с PHP 7.3. Отступ закрывающей метки удаляется из каждой строки тела, поэтому heredoc можно выровнять по коду. Каждая строка тела должна иметь отступ не меньше, чем у закрывающей метки, иначе PHP остановится с ошибкой разбора.

Как вызвать функцию внутри heredoc?

Heredoc подставляет только переменные, элементы массивов, свойства и вызовы методов. Вызовите функцию заранее и сохраните результат или положите имя функции либо замыкание в переменную и вызовите её внутри фигурных скобок: $e = 'htmlspecialchars';, затем {$e($text)}.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ