26

テンプレートに入れる価値のない、生成された 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 構文を持つことです。しかし、これはソース ファイルのプリコンパイラを作成しないと不可能だと思います。

私は正しいですか?

4

5 に答える 5

11

それは私もよくある問題です: ヒアドキュメントを使用するとコードがうまくインデントされず、ヒアドキュメントが本当に好きです :-(

「より大きな」問題は、コードのブロック全体を選択し、「タブ」(またはIDEの同等のもの)を押してさらにインデントすることです。これは、周囲に条件を追加したためです...そして、ヒアドキュメント文字列が壊れます:手でインデントを解除する必要があります:-(

残念ながら、あなたが説明しているようなツールは見たことがありません...


解決策は、ヒアドキュメント文字列を別のファイルに入れ、それを含めることだと思います-インクルードのようなものは通常どおりインデントできます; しかし、ロードするファイルが 1 つ増えることにもなり、コードがわかりにくくなります。

于 2010-02-21T12:54:43.480 に答える
4

これを行う方法をまだ疑問に思っている人のために、奇妙な回避策を発見しました。HEREDOC を開始する最初の行をインデントします。HEREDOC の最初の行である 2 行目に空白を入れてはならないので、空白行のままにしておきます。その後、新しい行を開始し、インデントしてコードを記述します。次に、ここでも空白なしで 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
于 2013-11-19T12:30:48.050 に答える
3

heredocs識別またはnowdocsPHPで行うことはできません。これは私の回避策です:

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 modsを使用すると、サーバーは不要なスペースをすべて削除します。

複数行のSQLクエリにも同じ手法を使用できます。

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

コードの可読性が向上します。パフォーマンスへの影響はなく、compex SQLクエリにコメントを付けることができます(#または-を使用)

于 2012-06-16T13:36:52.443 に答える
0

好きなようにインデントできる関数を書きました。これは実際には非常に単純な関数です。https://github.com/chiedolabs/moon-walk-php

私のコードはこのようにきれいに保たれるので、私はそれが好きです。

于 2015-12-13T03:42:16.153 に答える