/
Программирование
/
Курс PHP
/

Многострочные строки

PHP: Многострочные строки

Иногда текст в программе должен состоять из нескольких строк. Например, при генерации письма, создании шаблона, форматировании сообщения об ошибке или просто работе с длинными текстами.

Конечно, можно использовать символ перевода строки \n, как мы делали раньше:

<?php

$text = "Пример текста,\nсостоящего из\nнескольких строк";

На печати строка будет выглядеть вот так:

Пример текста,
состоящего из
нескольких строк

Но такой способ становится неудобным, особенно если строка длинная или нужно часто добавлять новые переносы. Каждый \n приходится вставлять вручную, и это ухудшает читаемость кода.

Heredoc как альтернатива

В PHP есть более удобный способ записывать текст в несколько строк: heredoc-синтаксис. После оператора <<< указывается идентификатор с произвольным именем, затем перевод строки и сам текст. В конце на отдельной строке добавляется тот же идентификатор, который закрывает строку:

<?php

$text = <<<EOT
Пример текста,
состоящего из
нескольких строк
EOT;

Теперь в коде все выглядит так же, как и при выводе:

Пример текста,
состоящего из
нескольких строк

Закрывающий идентификатор

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

Перевод строки перед закрывающим идентификатором не входит в результат. Поэтому строка выше заканчивается словом строк без пустой строки в конце — в отличие от некоторых других языков, где перенос закрывающих кавычек на новую строку добавляет лишний перевод строки.

Преимущества heredoc

  • Читаемость кода: текст в коде выглядит почти как на экране.
  • Удобство при редактировании: легко добавлять, удалять и менять строки.
  • Не нужно экранировать кавычки:
<?php

$quote = <<<EOT
Здесь не нужно экранировать ни 'одинарные', ни "двойные" кавычки
EOT;

Интерполяция внутри heredoc

Heredoc работает как строка в двойных кавычках: внутри можно подставлять значения переменных с помощью интерполяции:

<?php

$a = 'А';
$b = 'B';

$text = <<<EOT
{$a} и {$b}
сидели на трубе
EOT;

Вывод:

А и B
сидели на трубе

Это особенно удобно для шаблонов, писем, сообщений об ошибках и многострочных описаний.

Nowdoc

У heredoc есть «брат» — nowdoc. Разница в том, что идентификатор после <<< заключается в одинарные кавычки. Nowdoc ведет себя как строка в одинарных кавычках: интерполяция и спецсимволы внутри не работают, текст выводится как есть:

<?php

$name = 'Joffrey';

$text = <<<'EOT'
Hello, {$name}!
EOT;

print_r($text); // => Hello, {$name}!

Компьютер и человек воспринимают код по-разному

PHP может обработать и строки с \n, и heredoc. Для интерпретатора это одно и то же. Но для человека, читающего код, heredoc намного удобнее и нагляднее.

Задание

Интернет-магазин хранит текст письма о статусе заказа в переменной и отправляет его покупателю. Запишите в переменную $text текст письма, приведённый ниже. Используйте heredoc-синтаксис. Все переносы строк должны сохраниться.

Уважаемый пользователь!
Ваш заказ успешно оформлен.
Ожидаемая дата доставки: 3-5 рабочих дней.
Спасибо, что выбрали нас!

Полезное

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются