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会高亮显示。不高亮时,则证实语法有问题。