在PHP中使用Heredoc有什么优势?[关闭]


196

在PHP 中使用heredoc有什么优势,您可以举个例子吗?


4
没有强有力的理由使候补者比这里更好
Shakti Singh

18
我对其进行了编辑,使其更具建设性,并且使问题社区Wiki非常主观。注意,社区可能仍然关闭此窗口,我选择将其保持打开状态,因为您得到的是高质量的答案。
蒂姆·波斯特

9
为什么这个问题不算是建设性的?
Ambo100

Answers:


218

Heredoc语法对我来说更干净,它对于多行字符串和避免引用问题确实很有用。以前,我曾经使用它们来构造SQL查询:

$sql = <<<SQL
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = "widgets"
SQL;

对我来说,引入语法错误的可能性比使用引号的可能性低:

$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";

上面的pProblem是我刚才介绍的语法错误(缺少的转义引号),与此处的文档语法相反:

$x = <<<EOF
The point of the "argument" was to illustrate the use of here documents
EOF;

这有点风格,但是我将以下内容用作定义字符串的单,双和此处文档的规则:

  • 当字符串是一个常量时,例如使用引号'no variables here'
  • 引号时,我可以把串在一行,并要求变量代换或嵌入的单引号"Today is ${user}'s birthday"
  • 此处记录了需要格式化和变量插值的多行字符串。

40
Nitpick在您的SQL示例中:首先不应在其中使用双引号。这仅适用于MySQL,并且仅适用于该服务器未在--ansi兼容模式下运行的情况。SQL字符串必须使用单引号。
mario

17
@mario只是为了说明使用双引号而不是有关sql的细节的问题
Wes

4
并不是说直接将变量放入查询是一种不好的态度:-P
您的常识

5
@Wes和@mario这是ANSI SQL:SELECT * FROM "order" WHERE "table"='1'
programaths

11
“并不是说直接将变量放入查询是一种不好的方式。” 这根本不是真的。将未经验证的输入放入SQL语句是“不良方式”。有时需要在SQL语句中放置变量。
vogomatix '16

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;

它易于阅读且易于维护。

另一种方法是回显带引号的字符串,该字符串最终包含转义的引号,并且IDE不会突出显示该语言的语法,这会导致可读性差和维护难度更大。

更新常识答案

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

$sql = <<<SQL
       SELECT * FROM table
SQL;

1
您是否偶然知道PHP的“ 逃脱PHP ”功能?
您的常识2012年

5
从PHP进行转义有时是可以的,但是当您回显很多东西时,语法突出显示会中断,您必须通过简单地从PHP进行转义来键入更多的字符,并且PHP具有更多要执行的命令,而不是单个回显。另外,您可以将Heredoc字符串设置为变量,并在以后回显它。为您的HTML转义PHP意味着它会随即被打印出来。无法保存以备后用。
杰克·威尔逊

2
1.您可以使用输出缓冲来保存输出。2.您在第一个示例中使用了echo。3.(良好)IDE或文本编辑器在使用PHP转义时,绝不要破坏HTML高亮显示。4. HEREDOC的语法突出显示了哪种IDE,以及使用了哪些语言规则?可以将SQL查询突出显示为HTML文本吗?
您的常识2012年

1
Heredoc是一个PHP字符串。当然,您不能在字符串中使用控制结构。php.net/manual/en/language.types.string.php
Jake Wilson

11
我认为您误解了Heredoc仅适用于HTML字符串。Heredoc只是定义字符串的另一种方式,无论是HTML还是SQL查询还是您想要的任何东西。它们的编写和维护更加容易,Wes在上面的回答很明显地表明了这一点(如果您注意到语法正确地突出显示,请不要对NetBeans失败向我抱怨)。我不确定您为什么偏偏拒绝社区Wiki问题的答案...信不信由你,原始的PHP开发人员可能在PHP中包含了Heredoc,因为在某些情况下它可能确实有用。 。
杰克威尔逊

8

某些IDE会自动在Heredoc字符串中突出显示代码-这使得将Heredoc用于XML或HTML具有视觉吸引力。

我个人比较喜欢XML的较长部分,因为我不必担心引用引号,而只需粘贴XML。


6

首先,所有原因都是主观的。这更像是口味问题,而不是原因。

就我个人而言,我发现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

至于被接受的答案中的例子,这仅仅是在作弊。
实际上,如果不作弊,字符串示例会更加简洁

$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';

3

我不知道我是否会说heredoc是懒惰。可以说,做任何事情都是懒惰,因为总是有更多麻烦的方法来做任何事情。

例如,在某些情况下,您可能需要输出带有嵌入式变量的文本,而不必从文件中获取并运行模板替换。Heredoc允许您不必转义引号,因此您看到的文本就是您输出的文本。显然有一些负面因素,例如,您不能缩进Heredoc,并且在某些情况下会令人沮丧,尤其是如果您是统一语法的坚持者。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.