Heredoc 結構就象是沒有使用雙引號的雙引號字符串,這就是說在 heredoc 結構中單引號不用被轉義。其結構中的變量將被替換,但在 heredoc 結構中含有複雜的變量時要格外當心。其對格式化輸出內容時,比較有用 。具體其有如下特色:php
一、開始標記和結束標記使用相同的字符串,一般以大寫字母來寫。html
二、開始標記後不能出現空格或多餘的字符。vim
三、結束標記必須頂頭寫,不能有縮進和空格,且在結束標記末尾要有分號 。api
四、位於開始標記和結束標記之間的變量能夠被正常解析,可是函數則不能夠。在heredoc中,變量不須要用鏈接符.或,來拼接 。運維
如:函數
function outputhtml() { //自 PHP 5.3.0 起還能夠在 Heredoc 結構中用雙引號來聲明標識符,因此開頭這句也能夠寫爲echo <<<"EOT" echo <<<EOT <html> <head><title>主頁</title></head> <body>主頁內容</body> </html> EOT; } outputhtml();
這裏,就不用像普通的php寫法那樣,echo "<html>" echo "<head>……" ,這樣不但看上去舒服易讀,並且也省去了每行雙引號的引用。ui
再給出一個變量引用的例子:this
<?php $name = '361way運維之路'; print <<<EOT <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>Untitled Document</title> </head> <body> <!--12321--> Hello,$name! </body> </html> EOT; ?>
在 PHP 5.3.0 及其之後的版本中增長了nowdoc結構,其用法和heredoc相同,不一樣的是Nowdoc 結構是相似於單引號字符串的。nowdoc 中不進行解析操做。這種結構很適合用於嵌入 PHP 代碼或其它大段文本而無需對其中的特殊字符進行轉義。與 SGML 的 結構是用來聲明大段的不用解析的文本相似,nowdoc 結構也有相同的特徵。spa
一個 nowdoc 結構也用和 heredocs 結構同樣的標記 <<<, 可是跟在後面的標識符要用單引號括起來,即 <<<'EOT'。code
例如:now結構中複雜變理的示例
<?php $str = <<<'EOD' 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 <<<'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 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會高亮顯示。不高亮時,則證實語法有問題。