В чем преимущество использования heredoc в PHP, и можете ли вы показать пример?
В чем преимущество использования heredoc в PHP?
Ответы (5)
Синтаксис heredoc для меня намного чище, и он действительно полезен для многострочных строк и позволяет избежать проблем с цитированием. Раньше я использовал их для построения SQL-запросов:
$sql = <<<SQL
select *
from $tablename
where id in [$order_ids_list]
and product_name = "widgets"
SQL;
Для меня вероятность появления синтаксической ошибки ниже, чем при использовании кавычек:
$sql = "
select *
from $tablename
where id in [$order_ids_list]
and product_name = \"widgets\"
";
Другой момент - избегать использования двойных кавычек в строке:
$x = "The point of the \"argument" was to illustrate the use of here documents";
Проблема с вышеизложенным - это синтаксическая ошибка (отсутствующая экранированная цитата), которую я только что представил, в отличие от синтаксиса здесь документа:
$x = <<<EOF
The point of the "argument" was to illustrate the use of here documents
EOF;
Это немного стиль, но я использую следующие правила для документов single, double и here для определения строк:
- Одиночные кавычки используются, когда строка является константой, например
'no variables here'
. - Двойные кавычки, когда я могу поместить строку в одну строку и требовать интерполяции переменных или встроенной одинарной кавычки
"Today is ${user}'s birthday"
- Здесь документы для многострочных строк, требующих форматирования и интерполяции переменных.
--ansi
совместимом режиме. Строки SQL должны использовать одинарные кавычки.
- person mario; 15.04.2011
SELECT * FROM "order" WHERE "table"='1'
- person programaths; 05.09.2013
HEREDOC
s
- person Kaspar Lee; 21.02.2016
private string $welcome = "Hello, $name";
недопустимо. До PHP 5.3 вы вообще не могли использовать heredoc для инициализации свойств класса, но в PHP 5.3 и более поздних версиях вы можете инициализировать свойства класса с помощью heredoc, если он не содержит никаких переменных (поскольку инициализация свойств класса с использованием переменных недопустима) .
- person Adrian Wiik; 23.03.2021
Heredoc - отличная альтернатива строкам в кавычках из-за повышенной удобочитаемости и удобства сопровождения. Вам не нужно экранировать кавычки, и (хорошие) IDE или текстовые редакторы будут использовать правильную подсветку синтаксиса.
очень распространенный пример: вывод HTML из PHP:
$html = <<<HTML
<div class='something'>
<ul class='mylist'>
<li>$something</li>
<li>$whatever</li>
<li>$testing123</li>
</ul>
</div>
HTML;
// Sometime later
echo $html;
Его легко читать и легко поддерживать.
Альтернативой является повторение строк в кавычках, которые в конечном итоге содержат экранированные кавычки, а IDE не собираются выделять синтаксис для этого языка, что приводит к плохой читаемости и трудностям в обслуживании.
Обновленный ответ для вашего здравого смысла
Конечно, вы не хотели бы, чтобы SQL-запрос был выделен как HTML. Чтобы использовать другие языки, просто измените язык в синтаксисе:
$sql = <<<SQL
SELECT * FROM table
SQL;
Некоторые IDE автоматически выделяют код в строках heredoc, что делает использование heredoc для XML или HTML визуально привлекательным.
Мне лично нравится это для более длинных частей, например, XML, поскольку мне не нужно указывать кавычки, и я могу просто вставить XML.
Во-первых, все причины субъективны. Это скорее вопрос вкуса, чем причины.
Лично я нахожу heredoc совершенно бесполезным и иногда использую его, большую часть времени, когда мне нужно добавить HTML в переменную и я не хочу возиться с буферизацией вывода, например, для формирования сообщения электронной почты в формате HTML.
Форматирование не соответствует общим правилам отступов, но я не думаю, что это имеет большое значение.
//some code at it's proper level
$this->body = <<<HERE
heredoc text sticks to the left border
but it seems OK to me.
HERE;
$this->title = "Feedback";
//and so on
Что касается примеров в принятом ответе, то это просто обман.
Строковые примеры, на самом деле, будут более краткими, если их не обмануть
$sql = "SELECT * FROM $tablename
WHERE id in [$order_ids_list]
AND product_name = 'widgets'";
$x = 'The point of the "argument" was to illustrate the use of here documents';
Не знаю, сказал бы я, что heredoc - это лень. Можно сказать, что делать что-либо - лень, потому что всегда есть более громоздкие способы сделать что-либо.
Например, в определенных ситуациях может потребоваться вывод текста со встроенными переменными без необходимости извлекать из файла и запускать замену шаблона. Heredoc позволяет вам отказаться от экранирования кавычек, поэтому текст, который вы видите, является текстом, который вы выводите. Ясно, что есть некоторые недостатки, например, вы не можете сделать отступ в своем heredoc, и это может расстраивать в определенной ситуации, особенно если вы сторонник унифицированного синтаксиса, как я.