2009-07-20 4 views
58

PHPとHTMLを混在させる場合、適切なインデントスタイルは何ですか?出力されたHTMLにインデントが正しくなるようにインデントするか、PHP/HTMLミックスが適切に書式設定されているように見えるようにします(読みやすくなります)。PHP/HTML混合コードを正しく字下げするにはどうすればいいですか?

たとえば、私はforeachループテーブルの行を出力しているとします。以下のうち正しいものはどれですか?

PHP/HTMLのミックスが正しいよう:

<table> 
    <?php foreach ($rows as $row): ?> 
    <tr> 
     <?php if ($row->foo()): ?> 
     <?php echo $row ?> 
     <?php else: ?> 
     Something else 
     <?php endif ?> 
    </tr> 
    <?php endforeach ?> 
</table> 

出力HTMLが正しいになります

<table> 
<?php foreach ($rows as $row): ?> 
    <tr> 
    <?php if ($row->foo()): ?> 
    <?php echo $row ?> 
    <?php else: ?> 
    Something else 
    <?php endif ?> 
    </tr> 
<?php endforeach ?> 
</table> 

私が見つけたこと、私は(かなり頻繁に)このような状況に遭遇したときに、私は標準的なスタイルを使用する必要はありません。私は "正しい"答えがないかもしれないことを知っていますが、私は他の開発者からの意見を聞きたいです。

答えて

46

互いにおよび出力形式に関係なく、ソース形式で自身に対して正確であるようにPHPとHTMLは、それぞれインデントされるべきである:私は一般開口 PHPタグを置く

<table> 
<?php foreach ($rows as $row): ?> 
    <tr> 
    <?php if ($row->foo()): ?> 
     <?php echo $row ?> 
    <?php else: ?> 
     Something else 
    <?php endif ?> 
    </tr> 
<?php endforeach ?> 
</table> 
+0

エコーする代わりにテーブルを含む文字列を取得したい場合はどうしますか? – Dane411

+1

@ Dane411:heredoc構文を使用して文字列を作成する場合は、HTMLとしてインデントします。小さなインライン文字列から構築する場合は、HTMLの字下げを忘れてしまいます.HTMLコンテンツの視覚的な理解がすでに洗い流されているため、より厄介な慣習で状況を熟考することは何の助けにもなりません。 – chaos

+0

このアプローチを主張する一般的に受け入れられているスタイルガイドはありますか? – Flimm

7

HTMLの書式に一致するようにタグ内にあるものはすべてインデントします。私は短いオープンタグを使用しているので、私は単純なエコーステートメントについてはこれをしません。私は、すべての宣言を見つけるためにファイルをブラウズするとき、それが簡単になると思う。あなたの質問へ

<table> 
<? foreach ($foo as $bar): ?> 
     <tr> 
<? foreach ($bar as $baz): ?> 

     <td><?=$baz?></td> 

<? endforeach ?> 
     </tr> 
<? endforeach ?> 
    </table> 
+0

+1を参照することができます。+1:これは私が実際に書く方法ですまあ、私は中括弧を使用していますが、コロン/エンドフォームではなく、インデントレベルごとに4つのスペースを使用します)。私はちょうど利便性のためにOPの慣習を適応させました。 – chaos

+0

あなたのページをすばやくスキャンするのがずっと難しくなるので、私はこの習慣から脱しました。 – deceze

+2

短い開始タグは使用しないでください。 phpの設定short_open_tagに接続しているコードで、さまざまな問題に遭遇する可能性があります。 – markus

4
  1. 直接の答え:あなたは、多くの場合、HTML出力を読み取る必要がある場合は、それが出力うまくインデントHTMLに良いことかもしれません。しかし、より一般的なケースは、あなたのPHPソースコードを読む必要があるので、ソースが簡単に読みやすいことが重要です。
  2. あなたが言及した2つのオプションの代わりに:chaos'またはtj111's答えを参照してください。
  3. 私の意見では、HTMLとPHPを混在させないで、代わりにテンプレートエンジンを使用してください。
+2

コメントありがとうTreb。テンプレートエンジンを使用しても、HTML /テンプレートエンジンのタグを適切にインデントする方法はまだ存在します。 –

+6

PHPはテンプレートエンジンです。 :) – chaos

+1

@chaos:私は答えが来るだろうと知っていました...たぶんそうですが、ここのサンプルコードでは、テンプレートエンジンを適切に使用するのではなく、コードとデザインが混在しています。 – Treb

2

いつも少しの空白を使用して読みやすくすることもできます。混沌インデントの構築:これで

<table> 

<?php foreach ($rows as $row): ?> 

    <tr> 

    <?php if ($row->foo()): ?> 
     <?php echo $row ?> 
    <?php else: ?> 

     Something else 

    <?php endif ?> 

    </tr> 

    <?php endforeach ?> 

</table 

唯一の欠点は、あなたが混合コードのたくさんを持っている場合、それはより多くのスクロールになりこれ、あなたの文書は倍の長にすることができます。このような混合コードがある場合は、テンプレートエンジンを検討することもできます。

+0

あなたはちょうどすべてのIMHOで透明度に実際に追加しないいくつかの改行を追加しました。まともなIDEを取得し、それはあなたのためにうまく色付けする必要があります。 – mpen

+0

これは本当に完全に主観的な問題なので、もちろん、何人かのための補佐官になるかもしれないものは、他人のために何もしません。 :) – Etzeitet

9

私はしばしばこの疑問を熟考しましたが、その後、HTML出力がどのようなものか気にしていましたか?あなたのユーザーはあなたのHTMLを見てはいけません。あなたはYOUのために読んで、そしておそらくカップルの他の開発者です。 ソースコードをできるだけきれいに保ち、出力がどのように見えるか忘れてください。

出力をデバッグする必要がある場合は、Chromeデベロッパーツール、Firebug、さらにはF12ツールを使用します。

2

実稼働環境でのマークアップのインデントについて気にする必要はありません。また、Tidyやその他のHTML浄化装置を使用しないでください。有効なユースケースがあります。 HTML入力を許可すると(ただし、代わりにMarkdownを使用することを検討してください)、これらはまれです。

多くの場合、HTML美化器フィルタは、コードの根本的な問題を隠すために悪用されます。しないでください。手動でマークアップを修正してください。

開発環境でのみコードをインデントする必要がある場合は、上記のいずれかを使用できます。ただし、これらのライブラリはマークアップを修正しようとします(主な用途はインデントが副産物です)。私は正規表現ベースのインデントツールDindentを書いた。これに

<!DOCTYPE html> 
<html> 
<head></head> 
<body> 
    <script> 
    console.log('te> <st'); 
    function() { 
     test; <!-- <a> --> 
    } 
    </script> 
    <div> 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
    <div><table border="1" style="background-color: red;"><tr><td>A cell test!</td> 
<td colspan="2" rowspan="2"><table border="1" style="background-color: green;"><tr> <td>Cell</td><td colspan="2" rowspan="2"></td></tr><tr> 
     <td><input><input><input></td></tr><tr><td>Cell</td><td>Cell</td><td>Ce 
      ll</td></tr></table></td></tr><tr><td>Test <span>Ce  ll</span></td></tr><tr><td>Cell</td><td>Cell</td><td>Cell</td></tr></table></div></div> 
</body> 
</html> 

<!DOCTYPE html> 
<html> 
    <head></head> 
    <body> 
     <script> 
    console.log('te> <st'); 
    function() { 
     test; <!-- <a> --> 
    } 
    </script> 
     <div> 
      <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
      <div> 
       <table border="1" style="background-color: red;"> 
        <tr> 
         <td>A cell test!</td> 
         <td colspan="2" rowspan="2"> 
          <table border="1" style="background-color: green;"> 
           <tr> 
            <td>Cell</td> 
            <td colspan="2" rowspan="2"></td> 
           </tr> 
           <tr> 
            <td> 
             <input> 
             <input> 
             <input> 
            </td> 
           </tr> 
           <tr> 
            <td>Cell</td> 
            <td>Cell</td> 
            <td>Ce ll</td> 
           </tr> 
          </table> 
         </td> 
        </tr> 
        <tr> 
         <td>Test <span>Ce ll</span></td> 
        </tr> 
        <tr> 
         <td>Cell</td> 
         <td>Cell</td> 
         <td>Cell</td> 
        </tr> 
       </table> 
      </div> 
     </div> 
    </body> 
</html> 

Dindentがサニタイズまたはその他のインデントを追加することを超えて、あなたのコードに干渉しようとしません

Dindentはこのようにマークアップを変換します。これは、開発/デバッグを容易にするためです。生産用ではありません。

関連する問題