最近在维护一个古老的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/