標籤:
最近在維護一個古老的PHP網站,沒有前背景分離,代碼看起來很吃力,上面大段大段的HTML輸出。在看的時候發現很多地方用了「<<<」這樣的符號來標記字串,好像之前學習PHP的時候,只講了單雙引號兩種表示字串的方式。今天偶然在書上看到了,這種「<<<」表示字串的方式是heredoc和nowdoc結構。
echo <<<EOT <html> <head><title>首頁</title></head> <body>首頁內容</body> </html>EOT;
一般來說,如果一段字串裡面有引號的話,我們會使用「\”」來進行轉義,PHP中單引號和雙引號都可以表示字串,因此也可以使用單引號表示字串的開始和結束。
echo '這裡的"雙引號"不用轉義';
在HTML裡面,標籤的屬性也使用了xxx=”yyy”的方式來表示。
<divid="div-id"class="div-class"></div>
在輸出大段HTML的時候,對所有雙引號進行轉義的工作量太大,而且對於維護不是很方便,經常出現引號沒對齊的錯誤。通常我們會使用單引號來表示這種大段的裡面有雙引號的字串。
不過HTML裡面,也是允許單引號表示屬性的。如果在輸出的HTML裡面存在單雙引號混用的情況,傳統的單雙引號字串會比較麻煩,因此我們使用了heredoc模式來表示字串。
echo<<<EOT <div id="div-id"class="div-class">$content</div>EOT;
,heredoc模式相當於另外定義了一個字串結束標記EOT,在「<<<EOT」和「EOT」之間的單雙引號,都不會被當成字串開始和結束標記。這對於我們格式化輸出內容是很有用的。
heredoc的使用具有如下特點:
1、開始標記和結束標記使用相同的字串,通常以大寫字母來寫。
2、開始標記後不能出現空格或多餘的字元。
3、結束標記必須頂頭寫,不能有縮排和空格,且在結束標記末尾要有分號 。
4、位於開始標記和結束標記之間的變數可以被正常解析,但是函數則不可以。在heredoc中,變數不需要用串連符「.」或「,」來拼接 。
在PHP5.3.0及其以後的版本中增加了nowdoc結構,其用法和heredoc相同,不同的是nowdoc類似於單引號,不會解析開始標記和結束標記之間的變數,這種結構很適合用於嵌入 PHP 代碼或其它大段文本而無需對其中的特殊字元進行轉義。
同樣的之前的例子用nowdoc結構可以表示為:
echo<<<'EOT' <div id="div-id"class="div-class">$content</div>EOT;
和heredoc結構用法唯一的區別就是開始標記用引號包起來,這裡的$content會被原樣輸出而不會被解析成變數的值。
在使用heredoc和nowdoc結構的時候,經常會遇到如下的報錯:
Parse error: syntax error, unexpected T_SL in php
一般產生這種問題的原因是定界符之後有空格引起的,例如上面的EOT後面有空格就會報這個錯誤。處理是否有空格還有一個小技巧,就是利用編輯器的代碼提示功能,以我用的notepad++為例。
正常的代碼裡面,整個heredoc結構字串都是灰色的。
搬運自我的技術部落格:http://www.cc-lab.cn/heredocandnowdoc/
PHP中字串的heredoc結構和nowdoc結構