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 с автоматическим отступом. Но я думаю, что это невозможно без написания предварительного компилятора для исходных файлов.

Правильно ли я?

Ответы

Ответ 1

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

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

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


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

Ответ 2

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

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

Ответ 3

Вы не можете идентифицировать 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 или подобные мотивы 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 (С# или -)

Ответ 4

Я только что обнаружил странное обходное решение для всех, кто все еще задавался вопросом, как это сделать. Отступьте свою первую строку, которая запускает 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

Ответ 5

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

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