В чем преимущество использования heredoc в PHP?

В чем преимущество использования heredoc в PHP, и можете ли вы показать пример?


person Community    schedule 15.04.2011    source источник
comment
Нет веских причин, по которым альтернативы лучше, чем heredocs   -  person Shakti Singh    schedule 15.04.2011
comment
Я отредактировал его, чтобы он был более конструктивным, и сделал вопрос сообщества вики, поскольку он довольно субъективен. Обратите внимание: сообщество все еще может закрыть это окно, я решил оставить его открытым, потому что вы получаете качественные ответы.   -  person Tim Post♦    schedule 15.04.2011
comment
Почему именно этот вопрос не считается конструктивным?   -  person Ambo100    schedule 28.12.2016


Ответы (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"
  • Здесь документы для многострочных строк, требующих форматирования и интерполяции переменных.
person Community    schedule 15.04.2011
comment
Nitpick в вашем примере SQL: вы не должны использовать там двойные кавычки. Это работает только с MySQL и только тогда, когда этот сервер не работает в --ansi совместимом режиме. Строки SQL должны использовать одинарные кавычки. - person mario; 15.04.2011
comment
@mario Это было для иллюстрации проблемы с использованием двойных кавычек в целом, а не о специфике sql - person Wes; 15.04.2011
comment
@Col. Шрапнель бесполезна - сильное слово, потому что она строит веревку. У вас никогда не было ситуации, когда вы хотите построить длинную строку с двойными кавычками и пропустили их правильное экранирование? Здесь документы имеют свое место, и на php хорошо их поддерживать. - person Wes; 15.04.2011
comment
Нельзя сказать, что помещать переменные в запрос напрямую - это дурной тоном :-P - person Your Common Sense; 15.04.2011
comment
ну почему тогда это лучше: $ var = my string. \ r \ n многострочный. \ r \ n, потому что мне это нравится; ? (ps: строки в комментариях не разрываются, так что представьте, что они ломаются: P) - person Jonathan dos Santos; 19.03.2012
comment
Также в этом случае HEREDOC позволяет вам начинать писать с новой строки, сохраняя ее более удобной для обзора, не вводя разрыв строки в начале строки. - person Áxel Costas Pena; 01.02.2013
comment
@Wes и @mario Это ANSI SQL: SELECT * FROM "order" WHERE "table"='1' - person programaths; 05.09.2013
comment
StackOverflow необходимо изменить подсветку синтаксиса для обработки HEREDOCs - person Kaspar Lee; 21.02.2016
comment
Нельзя сказать, что помещать переменные непосредственно в запрос - это дурной тоном. Это совсем не так. Помещать непроверенные входные данные в операторы SQL - это дурной тон. Иногда необходимо помещать переменные внутри операторов SQL. - person vogomatix; 11.04.2016
comment
То, что означает Heredocs, не может использоваться для инициализации свойств класса. Начиная с PHP 5.3 это ограничение действует только для heredocs, содержащих переменные.? Кто-нибудь, пожалуйста, обновите ответ, поясняющий значение этих предложений. - person PHPFan; 26.11.2017
comment
@PHPFan Невозможно инициализировать свойство класса переменной в качестве значения по умолчанию: 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;
person Community    schedule 13.03.2012
comment
Знаете ли вы, что в PHP есть выход из PHP? - person Your Common Sense; 13.03.2012
comment
Экранирование из PHP иногда нормально, но когда вы повторяете много чего, ваша подсветка синтаксиса прерывается, вам нужно ввести больше символов путем простого экранирования из PHP, а PHP имеет больше команд для выполнения вместо одного эха. Кроме того, вы можете установить строку Heredoc для переменной и повторить ее позже. Экранирование PHP для вашего HTML означает, что он будет распечатан тут же. Не могу отложить это на потом. - person Jake Wilson; 13.03.2012
comment
1. вы можете использовать буферизацию вывода для сохранения вывода. 2. В первом примере вы использовали эхо. 3. (хорошо) IDE или текстовые редакторы НИКОГДА не прерывают выделение HTML, когда вы используете экранирование из PHP. 4. Какая среда IDE выделяет синтаксис для HEREDOC и какие языковые правила используются? Можно ли видеть SQL-запрос, выделенный как текст HTML? - person Your Common Sense; 13.03.2012
comment
Текстовый редактор, который я использую, Sublime Text, отлично справляется с подсветкой синтаксиса для Heredoc. Что касается языка, я обновил свой ответ, чтобы проиллюстрировать, как изменить язык для Heredoc. Похоже, вам нужно кое-что почитать по этой теме. Не уверен, почему вы проголосовали против чего-то, даже не понимая основ темы ... - person Jake Wilson; 13.03.2012
comment
5. Вы не можете использовать управляющие структуры PHP внутри heredoc, что делает его инструмент чрезвычайно ограниченным. - person Your Common Sense; 13.03.2012
comment
Heredoc - это строка PHP. Конечно, вы не можете использовать управляющие структуры в строке. php.net/manual/en/language.types.string.php - person Jake Wilson; 13.03.2012
comment
В том-то и дело, если вы этого не поняли. Существует 2 основных сценария вывода HTML: 1. Отправка большого блока необработанного HTML / JS без каких-либо переменных PHP. Для этого вам не нужен heredoc, так как вы можете сохранить свой HTML в файле и читать его как есть. 2. Шаблон HTML со всеми выходными данными бизнес-логики. Вы не можете использовать здесь heredoc по указанной выше причине. Единственное, что осталось от heredoc, - это хранение некоторых странных фрагментов HTML, таких как электронные письма HTML. - person Your Common Sense; 13.03.2012
comment
Хотя мне понравилась эта функция подсказки языка. Только что протестировал с NetBeans. По крайней мере, из коробки он не выделяет синтаксис в heredocs, несмотря на подсказки в ярлыке. - person Your Common Sense; 13.03.2012
comment
Я думаю, вы неправильно понимаете, что Heredoc относится только к строкам HTML. Heredoc - это просто альтернативный способ определения строки, будь то HTML или SQL-запрос или что-то еще, что вы хотите. Их легче писать и поддерживать, ответ Уэса выше показывает это совершенно очевидно (который, если вы заметили, имеет правильную подсветку синтаксиса. Не жалуйтесь мне на сбой NetBeans). Я не уверен, почему вы так склонны голосовать против ответа на вопрос сообщества вики ... Хотите верьте, хотите нет, но оригинальные разработчики PHP, возможно, включили Heredoc в PHP, потому что это может быть действительно полезно в некоторых случаях .. . - person Jake Wilson; 13.03.2012

Некоторые IDE автоматически выделяют код в строках heredoc, что делает использование heredoc для XML или HTML визуально привлекательным.

Мне лично нравится это для более длинных частей, например, XML, поскольку мне не нужно указывать кавычки, и я могу просто вставить XML.

person Community    schedule 15.04.2011

Во-первых, все причины субъективны. Это скорее вопрос вкуса, чем причины.

Лично я нахожу 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';
person Community    schedule 15.04.2011

Не знаю, сказал бы я, что heredoc - это лень. Можно сказать, что делать что-либо - лень, потому что всегда есть более громоздкие способы сделать что-либо.

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

person Community    schedule 15.04.2011