PHP中的heredoc和nowdoc的区别是什么

来源:转载


一、heredoc结构及用法 Heredoc结构就象是没有使用双引号的双引号字符串,这就是说在heredoc结构中单引号不用被转义。其结构中的变量将被替换,但在heredoc结构中含有复杂的变量时要格外小心。其对格式化输出内容时,比较有用。具体其有以下特点: 1、开始标记和结束标记使用相同的字符串,通常以大写字母来写。 2、开始标记后不能出现空格或多余的字符。 3、结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号。 4、位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。在heredoc中,变量不需要用连接符.或,来拼接。 如:


functionoutputhtml()
{
//自PHP5.3.0起还可以在Heredoc结构中用双引号来声明标识符,所以开头这句也可以写为echo<<<"EOT"
echo<<
主页
主页内容

EOT;
}
outputhtml();

这里,就不用像普通的php写法那样,echo""echo"……",这样不但看上去舒服易读,而且也省去了每行双引号的引用。 再给出一个变量引用的例子:


<?php
$name='361way运维之路';
print<<


UntitledDocument



Hello,$name!


EOT;
?>

二、nowdoc结构及用法 在PHP5.3.0及其以后的版本中增加了nowdoc结构,其用法和heredoc相同,不同的是Nowdoc结构是类似于单引号字符串的。nowdoc中不进行解析操作。这种结构很适合用于嵌入PHP代码或其它大段文本而无需对其中的特殊字符进行转义。与SGML的结构是用来声明大段的不用解析的文本类似,nowdoc结构也有相同的特征。 一个nowdoc结构也用和heredocs结构一样的标记<<<,但是跟在后面的标识符要用单引号括起来,即<<<'EOT'。 例如:now结构中复杂变理的示例


<?php
$str=<<<'EOD'
Exampleofstring
spanningmultiplelines
usingnowdocsyntax.
EOD;
/*含有变量的更复杂的示例*/
classfoo
{
public$foo;
public$bar;
functionfoo()
{
$this->foo='Foo';
$this->bar=array('Bar1','Bar2','Bar3');
}
}
$foo=newfoo();
$name='MyName';
echo<<<'EOT'
Mynameis"$name".Iamprintingsome$foo->foo.
Now,Iamprintingsome{$foo->bar[1]}.
Thisshouldnotprintacapital'A':x41
EOT;
?>

其输出为:


Mynameis"$name".Iamprintingsome$foo->foo.
Now,Iamprintingsome{$foo->bar[1]}.
Thisshouldnotprintacapital'A':x41

具体可以和heredoc中的作下比较,在heredoc中,变量会被正常解析。x41也会被解析也A。 三、其他 在使用heredoc和nowdoc时,经常会遇到如下报错: Parseerror:syntaxerror,unexpectedT_SLinphp 一段遇到该问题的原因是定界符之后空格的问题引起的。如上例中的EOT后面有空格就会报这个错。处理是否有空格还有一个小技巧。以vim为例,语法正确时,开始和结尾处的EOF会高亮显示。不高亮时,则证明语法有问题。

分享给朋友:
您可能感兴趣的文章:
随机阅读: