HEREDOC вмешивается в отступы кода

Мне нравится синтаксис HEREDOC, например, для краевых случаев сгенерированного HTML, которые не стоит вставлять в шаблон.

Единственное, что меня раздражает, это то, что содержимое и заключительный маркер строки heredoc придерживаются первого столбца. Это устраняет вложенные макеты кода:

class myclass { function __construct() { $a = some_code(); $b = some_more_code(); $x = <<<EOT line1 line2 line3 line4 EOT; $c = even_more_code(); $b = still_more_code(); ... ... ... 

вы понимаете, что я имею в виду.

Теперь это, вероятно, не разрешимо, используя обычный HEREDOC. Кто-нибудь работал вокруг этого? Моя мечта была бы иметь синтаксис HEREDOC с автоматическим отступом. Но я думаю, это невозможно без написания предварительного компилятора для исходных файлов.

Я прав?

Solutions Collecting From Web of "HEREDOC вмешивается в отступы кода"

Это проблема, с которой я часто сталкиваюсь: код не очень отстутнут, когда я использую heredoc, и мне очень нравится heredoc 🙁

«Большая» проблема заключается в том, что вы выбираете целый блок кода, нажимаете «tab» (или любой эквивалент в вашей IDE ), чтобы отступать больше, потому что вы добавили условие arround или что-то еще … И он разбивает строки heredoc: вам нужно отменить их вручную 🙁

К несчастью, я никогда не видел ни одного инструмента, как тот, который вы описываете …

Решение, я полагаю, состояло бы в том, чтобы поместить строку heredoc в другой файл и включить его – включение, например, может быть отступом нормально; но это также означало бы загрузку еще одного файла, что сделало бы код менее ясным.

FYI, это не решает вашу проблему, но язык программирования Ruby поддерживает отступные heredocs.

Возможно, вы захотите отправить запрос функций разработчикам PHP и использовать документы Ruby в качестве примера для доказательства того, что существующий язык решает эту проблему, так почему же не PHP тоже?

Вы не можете идентифицировать heredocs или nowdocs в PHP. Это мое обходное решение:

 function foo() { $a = 123; $b = 456; $sum = $a + $b; $html = " <div> <h1>sum a, b</h1> Number a is $a, number b is $b<br> a+b equals <b>$sum<b> </div> "; echo $html; } 

Это добавляет пробелы к сгенерированному html-коду, но если вы используете mod_pagespeed или аналогичные mod_pagespeed apache, ваш сервер удалит все ненужные пробелы.

Вы можете использовать ту же технику для многострочных sql-запросов:

 function bar($sql, $id) { $q= " SELECT name , address , phone FROM users WHERE id = '$id' -- possible mysql inyection LIMIT 1 "; $sql->query($q); } 

Код становится читабельнее. Это не влияет на производительность, и вы можете комментировать SQL-запросы compex (с # или -)

Я просто обнаружил странное обходное решение для всех, кто все еще задавался вопросом, как это сделать. Отступьте свою первую строку, которая запускает HEREDOC. Вторая строка, которая является первой строкой HEREDOC, не должна иметь пробелов, поэтому оставьте ее пустой строкой. После этого запустите новую строку, отступьте ее и напишите свой код. Затем завершите HEREDOC, опять же без пробелов. Визуально вы получите весь отступ с кодом, за исключением завершения HEREDOC. Выделение + TAB по-прежнему является проблемой, но, по крайней мере, код более читабельен в циклах управления и т. Д., Теперь.

  $html = <<< HTML //indented line //leave this line empty <div> //indented line <div>$variable</div> //indented line </div> //indented line HTML; //no white space, not indented 

Я написал функцию, которая позволяет вам отступать по вашему желанию. На самом деле это довольно простая функция. https://github.com/chiedolabs/moon-walk-php

Мне это нравится, потому что мой код остается таким же.