【问题标题】:Advantages / inconveniences of heredoc vs nowdoc in phpphp中heredoc与nowdoc的优点/不便
【发布时间】:2012-06-24 13:35:58
【问题描述】:

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

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

heredoc 和 nowdoc 与另一个对新手来说很重要的优势相比有什么优势(即不是很小的优势,但对我来说很重要)。

【问题讨论】:

    标签: php heredoc nowdoc


    【解决方案1】:

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

    带有回显的Sql1 = 0.00011205673217773

    带有heredoc的sql2 = 9.7751617431641E-6

    结果 = Sql1 慢了 1046.3414634146%。

    【讨论】:

      【解决方案2】:

      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 更易于使用。就是这样。

      【解决方案3】:

      当您不想处理引用和取消引用复杂字符串时,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?

      【讨论】:

      • 可怕的建议。相反,了解什么是跨站点脚本漏洞,以及如何清理输入。这些是服务器端编程中的基本概念,对于初学者来说并不太复杂。使用模板系统来避免必须学习如何保护您的应用程序会使开发人员依赖可能有也可能没有自身漏洞的拐杖。更不用说,一个成熟的模板系统对于初学者将要承担的项目来说通常是矫枉过正的。
      • 您认为初学者将能够学习 XSS 以及清理和转义输入的所有问题,但考虑模板系统过度杀伤力。我认为您在平均而言哪个选项会带来最佳结果方面是错误的。这并不是说关于 xss 和转义的教育不好,但这是一个复杂的话题,应该从默认的良好转义标准开始,这通常只是你使用模板引擎得到的东西,新手不应该滚动他们自己的模板引擎。
      • 跨站脚本 (XSS) 或“为什么要转义输出” 假设您有一个网络论坛。如果攻击者创建这样的帖子怎么办:'I love forums.
      • 我不同意@siliconrockstar。这个答案不是建议人们不要学习 xss;事实上,阅读代码 sn-p 会让细心的人想知道那里发生了什么。向初学者提示在他们了解自己在做什么之前不要做什么是完全很好。
      • 唯一的“糟糕建议”是建议 PHP 初学者使用模板引擎来避免 XSS,他们甚至不了解转义和单引号与双引号字符串。您正在跳过其中的一些步骤。
      【解决方案4】:

      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相同的

      【讨论】:

        猜你喜欢
        • 2014-08-22
        • 1970-01-01
        • 2012-12-19
        • 2015-10-16
        • 2013-05-20
        • 2016-08-24
        • 1970-01-01
        • 2013-02-24
        • 2014-10-16
        相关资源
        最近更新 更多