Яка перевага використання heredoc в PHP? [зачинено]


196

Яка перевага використання heredoc в PHP, і чи можете ви показати приклад?


4
Немає вагомих причин, що заступники кращі за гередоки
Шакти Сінгх

18
Я відредагував це, щоб бути більш конструктивним, і зробив вікі спільноти питань, оскільки це досить суб'єктивно. Зауважте, спільнота може все-таки закрити це, я вирішив залишити це відкритим, оскільки ви отримуєте якісні відповіді.
Tim Post

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 повинні використовувати одинарні лапки.
mario

17
@mario Це було для ілюстрації проблеми із використанням подвійних цитат взагалі не про специфіку sql
Уес

4
Не кажучи про те, що розміщення змінних у запиті безпосередньо - це погана, погана манера :-P
Ваше загальне розуміння

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

11
"Не кажучи про те, що розміщення змінних у запиті безпосередньо - це погані, погані способи". Це зовсім не так. Розміщення неперевіреного вводу в оператори SQL - це "погані манери". Розміщення змінних всередині операторів SQL іноді необхідне.
vogomatix

67

Гередок є чудовою альтернативою цитованим рядкам через підвищення читабельності та ремонтопридатності. Вам не доведеться уникати лапок і (хороших) 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. Ви використовували ехо в своєму першому прикладі. 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 дозволяє вам відмовитися від необхідності уникати цитат, тому текст, який ви бачите, - це текст, який ви виводите. Зрозуміло, що є деякі негативи, наприклад, ви не можете відступити від свого гередока, і це може розчаруватися в певній ситуації, особливо якщо ваш стикер для єдиного синтаксису, який я є.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.