作为一个新手,我被建议最好使用heredoc与太多嵌套代码相比(参见Unexpected T_ELSE in php code)。
但我无法理解heredoc和nowdoc之间是否存在显着差异。
heredoc和nowdoc与其他对新手理解很重要的优点有什么好处(即不是很小的优点,但对我来说很重要)。
答案 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%。