在PHP中使用Heredoc有什么好处?

dan*_*car 190 php heredoc

在PHP 中使用Heredoc有什么好处,你能展示一个例子吗?

Wes*_*Wes 212

这里的doc语法对我来说更清晰,它对多行字符串和避免引用问题非常有用.在那天我曾经使用它们构建SQL查询:

$sql = <<<SQL
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = "widgets"
SQL;
Run Code Online (Sandbox Code Playgroud)

对我来说,引入语法错误的概率低于使用引号:

$sql = "
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = \"widgets\"
";
Run Code Online (Sandbox Code Playgroud)

另一点是避免在字符串中转义双引号:

$x = "The point of the \"argument" was to illustrate the use of here documents";
Run Code Online (Sandbox Code Playgroud)

上面的问题是我刚刚介绍的语法错误(缺少的转义引用),而不是这里的文档语法:

$x = <<<EOF
The point of the "argument" was to illustrate the use of here documents
EOF;
Run Code Online (Sandbox Code Playgroud)

这是一种风格,但我使用以下作为单,双和此文档的规则来定义字符串:

  • 当字符串是常量时使用引号'no variables here'
  • 引号时,我可以把串在一行,并要求变量代换或嵌入的单引号"Today is ${user}'s birthday"
  • 这里是需要格式化和变量插值的多行字符串的文档.

  • 你的SQL示例中的Nitpick:首先,你不应该在那里使用双引号.这只适用于MySQL,并且仅当该服务器不能以`--ansi`兼容模式运行时.SQL字符串*必须*使用单引号. (37认同)
  • @mario这是为了说明使用双引号的问题,而不是关于sql的细节 (16认同)
  • "并不是说直接将变量放入查询是一种糟糕的,不好的方式".这根本不是真的.将未经验证的输入放入SQL语句中是"不礼貌".有时需要在SQL语句中放置变量. (11认同)
  • 不是说直接将变量放入查询是一种坏的,坏的方式:-P (4认同)
  • @Wes和@mario这是ANSI SQL:``SELECT*FROM"order"WHERE"table"='1'`` (4认同)
  • @col.弹片无用是一个强有力的词,因为它确实构建了字符串.你有没有想过构建一个带有双引号的长字符串并且错过了正确逃避它们的情况?这里的文档有它们的位置,php支持它们很好. (2认同)

Jak*_*son 67

由于可读性和可维护性的提高,Heredoc是引用字符串的绝佳替代品.您不必转义引号,(好)IDE或文本编辑器将使用正确的语法突出显示.

一个非常常见的例子:在PHP中回显HTML:

$html = <<<HTML
  <div class='something'>
    <ul class='mylist'>
      <li>$something</li>
      <li>$whatever</li>
      <li>$testing123</li>
    </ul>
  </div>
HTML;

// sometime later
echo $html;
Run Code Online (Sandbox Code Playgroud)

易于阅读.易于维护.

另一种方法是回显引用的字符串,最终包含转义引号,IDE不会突出显示该语言的语法,这会导致可读性差,维护更加困难.

更新了您的常识的答案

当然,您不希望将SQL查询突出显示为HTML.要使用其他语言,只需更改语法中的语言:

$sql = <<<SQL
       SELECT * FROM table
SQL;
Run Code Online (Sandbox Code Playgroud)

  • 我认为你误解了Heredoc只适用于HTML字符串.Heredoc只是定义字符串的另一种方式,无论是HTML还是SQL查询或任何你想要的东西.它们更容易编写和维护,Wes上面的答案显示非常明显(如果你注意到它具有正确的语法突出显示.不要抱怨我关于NetBeans失败).我不确定为什么你似乎如此倾向于在​​社区维基问题上投票回答...信不信由你,最初的PHP开发人员可能已经在PHP中包含了Heredoc,因为在某些情况下它实际上可能有用. . (10认同)
  • 有时逃避PHP很好,但是当你回显很多东西时,你的语法突出显示中断,你必须通过简单的PHP转义来输入更多的字符,PHP有更多的命令来执行而不是单个回显.此外,您可以将Heredoc字符串设置为变量并稍后进行回显.为您的HTML转义PHP意味着它会随时打印出来.无法保存以供日后使用. (5认同)
  • 您是否知道 PHP 的“[逃离 PHP](http://php.net/manual/en/language.basic-syntax.phpmode.php)”功能? (2认同)
  • 1.您可以使用输出缓冲来保存输出.你在第一个例子中使用了echo.3.(好)IDE或文本编辑器**当你使用PHP转义时,千万不要破坏HTML突出显示.4. HEREDOC语法突出显示什么IDE以及使用了哪些语言规则?是否可以将SQL查询突出显示为HTML文本? (2认同)

cwe*_*ske 8

一些IDE会自动高亮显示heredoc字符串中的代码 - 这使得使用heredoc对xml或html进行视觉上的吸引力.

我个人喜欢它的更长部分即XML,因为我不必关心引用引号字符,只需粘贴XML即可.


You*_*nse 5

首先,所有原因都是主观的.
这更像是品味而不是理由.

就个人而言,我发现heredoc相当无用,偶尔使用,大部分时间我需要将一些HTML放入变量并且不想打扰输出缓冲,例如形成HTML电子邮件消息.

格式化不适合一般缩进规则,但我不认为这是一个大问题.

       //some code at it's proper level
       $this->body = <<<HERE
heredoc text sticks to the left border
but it seems OK to me.
HERE;
       $this->title = "Feedback";
       //and so on
Run Code Online (Sandbox Code Playgroud)

至于接受的答案中的例子,它只是作弊.
如果一个人不会欺骗他们,那么字符串示例实际上更简洁

$sql = "SELECT * FROM $tablename
        WHERE id in [$order_ids_list]
        AND product_name = 'widgets'";

$x = 'The point of the "argument" was to illustrate the use of here documents';
Run Code Online (Sandbox Code Playgroud)