2009-07-20 84 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應各自縮進,使得它們在源代碼的形式相對於自己正確的,彼此無關的和的輸出形式:

<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 2013-11-17 12:19:55

+1

@ Dane411:如果您使用heredoc語法構建字符串,請將其縮進爲HTML。如果你用小的內聯字符串來構建它,忘掉HTML縮進,因爲HTML內容的視覺可理解性已經是一種洗滌,用更笨拙的約定來解決這種情況不會對任何事情有所幫助。 – chaos 2013-11-22 07:00:03

+0

是否有一個普遍接受的風格指南,倡導這種方法? – Flimm 2017-02-07 15:03:44

7

我一般把開口 php標記在行的開頭,但縮進標籤內的任何內容以匹配html格式。但是,我不這樣做,因爲我使用短開標籤,因此對於簡單的回聲語句。當瀏覽文件來查找所有聲明時,我認爲它變得更簡單。

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

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

<? endforeach ?> 
     </tr> 
<? endforeach ?> 
    </table> 
4
  1. 直接回答你的問題:如果你需要經常閱讀HTML輸出,這可能是一件好事,輸出以及縮進HTML。但更常見的情況是,你需要閱讀你的PHP源代碼,所以更重要的是源代碼易於閱讀。
  2. 您提到的兩個選項的替代方法:請參閱chaos'tj111's的答案。
  3. 更好的是在我看來:不要混合HTML和PHP,而是使用模板引擎。
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 

這個唯一的缺點是,如果你有的混合代碼很多它可以讓您的文檔兩倍長,這使得更多的滾動。儘管如果你有這麼多的混合代碼,你可能想考慮一個模板引擎。

9

我也經常考慮這個問題,但後來我意識到,誰在乎HTML輸出是什麼樣子?無論如何,你的用戶不應該看你的HTML。這是爲YOU閱讀,也可能是其他開發人員。儘可能保持代碼儘可能乾淨,並忘記輸出的樣子。

如果您需要調試輸出,請使用Chrome開發人員工具,Firebug或甚至F12工具。

2

您不應該對生產環境中的標記壓痕感到困擾。您也不應該使用Tidy或其他HTML淨化器。有一些有效的用例,例如當你允許HTML輸入時(但是考慮使用Markdown來代替),儘管這很少見。

大多數HTML美化者 - 過濾器被濫用以隱藏代碼的潛在問題。別。手動更正您的標記。

如果您只需要在開發環境中縮進代碼,則可以使用上述任一方法。但是,請注意,這些庫將嘗試修正您的標記(這是他們的主要目的;縮進是副產品)。我已經編寫了基於正則表達式的縮進工具Dindent

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不會嘗試消毒或以其他方式與您的代碼添加以外干擾縮進。這是爲了使您的開發/調試更容易。不用於生產。