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


196

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


4
Нет веской причины, по которой заместители лучше наследственных
Шакти Сингх,

18
Я отредактировал это, чтобы сделать его более конструктивным, и сделал вопрос вики-сообщества, так как это довольно субъективно. Примечание. Сообщество все еще может закрыть это, я решил оставить его открытым, потому что вы получаете качественные ответы.
Тим Пост

9
Почему именно этот вопрос не считается конструктивным?
Ambo100

Ответы:


218

Синтаксис 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";

PProblem с вышеупомянутым является синтаксической ошибкой (отсутствующая экранированная кавычка), которую я только что представил в отличие от здесь синтаксиса документа:

$x = <<<EOF
The point of the "argument" was to illustrate the use of here documents
EOF;

Это немного стиль, но я использую следующее как правила для одинарных, двойных и здесь документов для определения строк:

  • Одиночные кавычки используются, когда строка является константой'no variables here'
  • Двойные кавычки, когда я могу поместить строку в одну строку и требовать интерполяции переменных или встроенной одинарной кавычки"Today is ${user}'s birthday"
  • Здесь документы для многострочных строк, которые требуют форматирования и интерполяции переменных.

40
Nitpick на вашем примере SQL: вы не должны использовать двойные кавычки там в первую очередь. Это работает только с MySQL и только тогда, когда этот сервер не работает в --ansiрежиме совместимости. Строки SQL должны использовать одинарные кавычки.
Марио

17
@mario Это было для иллюстрации проблемы с использованием двойных кавычек вообще, а не о специфике sql
Wes

4
Нельзя сказать, что размещение переменных в запросе напрямую - это плохие, плохие манеры :-P
Ваш здравый смысл

5
@Wes и @mario Это ANSI SQL:SELECT * FROM "order" WHERE "table"='1'
программы

11
«Нельзя сказать, что размещение переменных в запросе напрямую - это плохие, плохие манеры». Это совсем не так. Размещение неподтвержденного ввода в операторах SQL - это «плохие манеры». Размещение переменных внутри операторов SQL иногда необходимо.
vogomatix

67

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;

1
Вам случайно не знакома функция PHP " Побег из PHP "?
Ваш здравый смысл

5
Экранирование из PHP иногда хорошо, но когда вы повторяете много вещей, ваша подсветка синтаксиса прерывается, вы должны печатать больше символов простым выходом из PHP, и у PHP есть больше команд для выполнения вместо одного эха. Кроме того, вы можете установить строку Heredoc для переменной и повторить ее позже. Выход из PHP для вашего HTML означает, что он тут же распечатывается. Не могу сохранить его на потом.
Джейк Уилсон

2
1. вы можете использовать буферизацию вывода для сохранения вывода. 2. Вы использовали echo в своем первом примере. 3. (хорошо) IDE или текстовые редакторы НИКОГДА не нарушают подсветку HTML, когда вы используете выход из PHP. 4. Какую IDE выделяет синтаксис для HEREDOC и какие языковые правила используются? Можно ли видеть SQL-запрос выделенным в виде текста HTML?
Ваш здравый смысл

1
Heredoc - это строка PHP. Конечно, вы не можете использовать управляющие структуры в строке. php.net/manual/en/language.types.string.php
Джейк Уилсон,

11
Я думаю, вы неправильно понимаете, что Heredoc применяется только к строкам HTML. Heredoc - это просто альтернативный способ определения строки, будь то HTML, SQL-запрос или что угодно. Их легче писать и поддерживать, ответ Уэса выше показывает, что это вполне очевидно (что, если вы заметили, имеет правильную подсветку синтаксиса. Не жалуйтесь мне на сбой NetBeans). Я не уверен, почему вы, кажется, так склонны отказаться от голосования за ответ на вики-вопрос сообщества ... Хотите верьте, хотите нет, но оригинальные разработчики PHP могли включать Heredoc в PHP, потому что это может быть полезно в некоторых случаях ... .
Джейк Уилсон

8

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

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


6

Прежде всего, все причины субъективны. Это скорее вопрос вкуса, чем причины.

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

3

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.