2010-02-21 84 views
14

我喜歡HEREDOC語法,例如,對於不值得放入模板的生成HTML的邊緣情況。HEREDOC干擾代碼縮進

然而,唯一讓我惱火的是,內容和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語法。但是我想如果不爲源文件編寫一些預編譯器,這是不可能的。

我正確嗎?

回答

11

這是一個問題,我常常有太多:代碼是沒有得到很好的縮進時,我用定界符,我真的很喜歡定界符:-(

「更大」的問題是,當你選擇一個代碼整個塊,按「選項卡」(或您的IDE中的任何等效項)縮進更多,因爲您添加了一個條件或任何東西......並且它打破了heredoc字符串:您必須手動取消縮進:-(

不幸的是,我從來沒有見過像你描述一個任何工具......


我想,解決方法是將heredoc字符串放在另一個文件中,並將其包含在內 - include之類可以正常縮進;但它也意味着要加載一個文件,這會使代碼不太清晰。

+0

是的,包括另一個文件帶來了太多的困惑......我正在考慮爲CSS構建一個類似LESS的「預編譯器」,但似乎太多的努力(和一個額外的步驟) 。太糟糕了! –

+6

使用某種「預編譯器」也意味着您編寫和看到*(在您的IDE /編輯器中)*的代碼不是執行的代碼 - 這將成爲混淆的來源,有一天或另一天... –

+0

焦慮問題:我建議使用具有良好解析能力的編輯器來自動縮進代碼。良好的IDE(如PhpStorm)不會讓您縮進HEREDOC結束標籤,即使在明確寫入標籤時也是如此。 – TheOperator

6

僅供參考,這並不能解決您的問題,但Ruby編程語言支持縮進的heredocs。

您可能要發送的功能要求PHP開發者,並使用Ruby的文檔作爲一個例子證明現有的語言解決了這個問題,所以爲什麼不PHP嗎?

2

您無法在PHP中使用heredocsnowdocs。這是我的解決方法:

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或類似阿帕奇MODS的,你的服務器將刪除所有unnecesary空間。

可以使用多行SQL查詢同樣的技術:

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

可讀性的代碼收益。它對性能沒有任何影響,並且您可以評論極限SQL查詢(使用#或 - )

+2

這種方法的缺點是雙引號必須轉義。 – Tag

1

我剛剛發現了一個奇怪的解決方法,任何人仍然想知道如何執行此操作。縮進啓動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 
+1

我把這個答案回滾到了第1版。由@bgs所做的編輯徹底摧毀了Wes試圖創造的全部觀點。 –

0

我寫了一個函數,允許您按照自己的意願縮進。這實際上是一個非常簡單的功能。 https://github.com/chiedolabs/moon-walk-php

我喜歡它,因爲我的代碼以這種方式保持清潔。

+0

請問您可以查看以下meta文章嗎? [如何提供個人開源庫?](https://meta.stackexchange.com/q/229085) –

+0

是的,只是閱讀@MartijnPieters! – Chiedo

+1

*在你的GitHub頁面上使用moonwalk:*示例格式錯誤。 HEREDOC的結束標記必須出現在行的開頭,縮進是不可能的。 – TheOperator