【发布时间】:2012-06-24 13:35:58
【问题描述】:
作为一个新手,我被建议最好使用heredoc,而不是太多的嵌套代码(参见Unexpected T_ELSE in php code)。
但我无法理解 heredoc 和 nowdoc 之间是否存在显着差异。
heredoc 和 nowdoc 与另一个对新手来说很重要的优势相比有什么优势(即不是很小的优势,但对我来说很重要)。
【问题讨论】:
作为一个新手,我被建议最好使用heredoc,而不是太多的嵌套代码(参见Unexpected T_ELSE in php code)。
但我无法理解 heredoc 和 nowdoc 之间是否存在显着差异。
heredoc 和 nowdoc 与另一个对新手来说很重要的优势相比有什么优势(即不是很小的优势,但对我来说很重要)。
【问题讨论】:
Heredoc 比“text”、echo 'text' 和 nowdoc 快 1000 倍。
带有回显的Sql1 = 0.00011205673217773
带有heredoc的sql2 = 9.7751617431641E-6
结果 = Sql1 慢了 1046.3414634146%。
【讨论】:
Nowdocs 对于单引号字符串,就像 heredocs 对于双引号字符串一样。 nowdoc 的指定与heredoc 类似,但在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 更易于使用。就是这样。
【讨论】:
当您不想处理引用和取消引用复杂字符串时,Nowdoc 非常棒,因为它不会解释任何引号,也不会接受变量。因此,它非常适合手动显示实际代码 sn-ps!
但是,如果您将 heredocs 和 nowdocs 混合用于字符串内容块,这是一个很容易陷入的诱惑,您很容易遇到 XSS(跨站点脚本)问题,无论您在哪里使用 heredoc!因此,这种方法对我来说还不够干净,无法推荐给从 php 开始的开发人员!相反,您应该尝试对这些大型信息块使用模板(任何类型的,或您喜欢的任何模板引擎)。毕竟,您不希望 html 出现在您的 php 中,而且您 - 当然 - 不希望用户注入 javascript,例如:
$username = '<script>alert(document.cookie.toString())</script>';
$insecure_example = <<<HERE
I really like having my site exploited, $username
HERE;
因此,请勿使用 HEREDOCS 和 NOWDOCS 代替适当的模板方法或模板引擎。
无论语言或技术之间存在接口,您都必须进行编码。 php转sql?绑定。 php转html?编码。 http转php?
【讨论】:
heredocs
1. heredocs 文本的行为就像一个双引号字符串,没有双引号。
2. heredoc中的引号不需要转义,但转义码\n换行,
\r 回车,
\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使用与heredocs相同的
【讨论】: