一、heredoc結構及用法
Heredoc 結構就象是沒有使用雙引號的雙引號字符串,這就是說在 heredoc 結構中單引號不用被轉義。其結構中的變量將被替換,但在 heredoc 結構中含有復雜的變量時要格外小心。其對格式化輸出內容時,比較有用 。具體其有以下特點:
1、開始標記和結束標記使用相同的字符串,通常以大寫字母來寫。
2、開始標記后不能出現空格或多余的字符。
3、結束標記必須頂頭寫,不能有縮進和空格,且在結束標記末尾要有分號 。
4、位於開始標記和結束標記之間的變量可以被正常解析,但是函數則不可以。在heredoc中,變量不需要用連接符.或,來拼接 。
如:
function outputhtml()
{
//自 PHP 5.3.0 起還可以在 Heredoc 結構中用雙引號來聲明標識符,所以開頭這句也可以寫為echo <<
echo <<主頁
EOT;
}
outputhtml();
這里,就不用像普通的php寫法那樣,echo "" echo "
……" ,這樣不但看上去舒服易讀,而且也省去了每行雙引號的引用。再給出一個變量引用的例子:
$name = '361way運維之路';
print <<
Untitled DocumentHello,$name!
EOT;
?>
二、nowdoc結構及用法
在 PHP 5.3.0 及其以后的版本中增加了nowdoc結構,其用法和heredoc相同,不同的是Nowdoc 結構是類似於單引號字符串的。nowdoc 中不進行解析操作。這種結構很適合用於嵌入 PHP 代碼或其它大段文本而無需對其中的特殊字符進行轉義。與 SGML 的 結構是用來聲明大段的不用解析的文本類似,nowdoc 結構也有相同的特征。
一個 nowdoc 結構也用和 heredocs 結構一樣的標記 <<
例如:now結構中復雜變理的示例
$str = <<
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;
/* 含有變量的更復雜的示例 */
class foo
{
public $foo;
public $bar;
function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MyName';
echo <<
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': x41
EOT;
?>
其輸出為:
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': x41
具體可以和heredoc中的作下比較,在heredoc中,變量會被正常解析。x41也會被解析也A 。
三、其他
在使用heredoc和nowdoc時,經常會遇到如下報錯:
Parse error: syntax error, unexpected T_SL in php
一段遇到該問題的原因是定界符之后空格的問題引起的。如上例中的EOT后面有空格就會報這個錯。處理是否有空格還有一個小技巧。以vim為例,語法正確時,開始和結尾處的EOF會高亮顯示。不高亮時,則證明語法有問題。
=========擴展==================================================================================================================
Heredoc技術,在正規的PHP文檔中和技術書籍中一般沒有詳細講述,只是提到了這是一種Perl風格的字符串輸出技術。但是現在的一些論壇程序,和部分文章系統,都巧妙的使用heredoc技術,來部分的實現了界面與代碼的准分離,phpwind模板就是一個典型的例子。
如下:
$name = '淺水游';
print <<
Untitled DocumentHello,$name!
EOT;
?>
1.以<<
2.位於開始標記和結束標記之間的變量可以被正常解析,但是函數則不可以。在heredoc中,變量不需要用連接符.或,來拼接,如下:
$v=2;
$a= <<
"abc"$v"123"
EOF;
echo $a; //結果連同雙引號一起輸出:"abc"2 "123"
3.heredoc常用在輸出包含大量HTML語法d文檔的時候。比如:函數outputhtml()要輸出HTML的主頁。可以有兩種寫法。很明顯第二種寫法比較簡單和易於閱讀。
function outputhtml(){
echo "";
echo "
主頁";echo "
主頁內容";echo ";
}
function outputhtml()
{
echo <<主頁
EOT;
}
outputhtml();