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 рабочих дней.
Спасибо, что выбрали нас!Полезное
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 рабочих дней.
Спасибо, что выбрали нас!Полезное
Ваше упражнение проверяется по этим тестам
<?php
namespace HexletBasics\AdvancedStrings\MultilineStrings;
use HexletBasics\Exercise\TestCase;
class SolutionTest extends TestCase
{
public function test()
{
$expected = <<<EOT
Уважаемый пользователь!
Ваш заказ успешно оформлен.
Ожидаемая дата доставки: 3-5 рабочих дней.
Спасибо, что выбрали нас!
EOT;
$this->assertOutput($expected);
}
}Решение учителя откроется через:
20:00
