在php中heredoc vs nowdoc的优点/不便

时间:2012-06-22 08:55:20

标签: php heredoc nowdoc

作为一个新手,我被建议最好使用heredoc与太多嵌套代码相比(参见Unexpected T_ELSE in php code)。

但我无法理解heredoc和nowdoc之间是否存在显着差异。

heredoc和nowdoc与其他对新手理解很重要的优点有什么好处(即不是很小的优点,但对我来说很重要)。

4 个答案:

答案 0 :(得分:101)

  

Nowdocs是单引号字符串,heredocs是双引号字符串。类似于heredoc指定了nowdoc,但是在nowdoc内部没有进行解析。该构造非常适合嵌入PHP代码或其他大块文本而无需转义。

     

http://php.net/manual/en/language.types.string.php#language.types.string.syntax.nowdoc

换句话说:

$foo = 'bar';

$here = <<<HERE
    I'm here , $foo !
HERE;

$now = <<<'NOW'
    I'm now , $foo !      
NOW;

$here “我在这里,吧!”,而$now“我现在是,$ foo!”

如果您不需要变量插值但需要字符串中的$等特殊字符,则Nowdocs更易于使用。就是这样。

答案 1 :(得分:2)

<强> here文档
1. heredocs 文本的行为就像一个双引号字符串,没有双引号。
2. heredoc 中的引号不需要转义,但转义代码 \ n换行,
\ r \ n回车, \ t水平制表符,\ v垂直制表符,\ e转义符,\ f换页符,\反斜杠,\ $美元符号,\“双引号
仍然可以使用。变量已扩展,但必须同样小心在表达 heredoc 中的复杂变量时,与字符串一样。

示例:

$myname='Tikku';
$heredoc_exmaple= <<<HEREDOC
\\n ,\\r ,\t ,\r ,\\v ,\\e ,\f ,\\ , \ ,$89 ,$ , $myname , ' , \$myname ,  \" ,\'
HEREDOC;
echo $heredoc_exmaple;

//OUTPUT \n ,\r ,   , ,\v ,\e , ,\ , \ ,$89 ,$ , Tikku , ' , $myname , \" ,\'

<强> nowdocs
1. nowdocs 文本的行为就像一个单引号字符串,没有单引号。
2. nowdocs 中的引号不需要转义。变量不会在其中扩展。 nowdocs 的优点是嵌入PHP代码和转义码而无需转义。

示例:

$myname='Tikku';
$nowdoc_exmaple= <<<'NOWDOC'
\\n ,\\r ,\t ,\r ,\\v ,\\e ,\f ,\\ , \ ,$89 ,$ , $myname  , ' , \$myname ,  \" ,\'
NOWDOC;

echo $nowdoc_exmaple;

//OUTPUT \\n ,\\r ,\t ,\r ,\\v ,\\e ,\f ,\\ , \ ,$89 ,$ , $myname , ' , \$myname , \" ,\'

语法:nowdoc标识为相同的&lt;&lt;&lt;用于heredocs的序列,但后面的标识符用单引号括起来,例如&LT;&LT;&LT; 'NOWDOC'。 heredoc标识符的所有规则也适用于nowdoc标识符,尤其是关于结束标识符外观的标识符。

答案 2 :(得分:1)

当你不想处理引用和取消引用复杂字符串时,Nowdoc很棒,因为它不会解释任何引号并且它不会接受变量。因此,它非常适合手动显示实际的代码片段!

但是,如果您正在使用heredoc和nowdocs混合使用字符串内容块,这很容易陷入困境,那么您可能很容易遇到XSS(跨站点脚本)问题定界符!因此,这种方法不够干净,我不能向开始使用php的开发人员推荐!相反,您应该尝试使用模板(无论何种类型,或任何您喜欢的模板引擎)来处理这些大块信息。毕竟,你不想在你的PHP中使用html,而你 - 当然 - 不想要用户注入的javascript,例如:

$username = '<script>alert(document.cookie.toString())</script>';

$insecure_example = <<<HERE
    I really like having my site exploited, $username
HERE;

所以不要使用HEREDOCS和NOWDOCS代替合适的模板方法或模板引擎。

答案 3 :(得分:0)

Heredoc 比“text”、echo 'text' 和 nowdoc 快 1000 倍。

带有 echo = 0.00011205673217773 的 Sql1

带有heredoc的sql2 = 9.7751617431641E-6

结果 = Sql1 慢 1046.3414634146%。