在PHP中使用heredoc的优势是什么?

在PHP中使用heredoc的优点是什么,你能举个例子吗?

130307 次浏览

一些ide会自动突出显示heredoc字符串中的代码——这使得在XML或HTML中使用heredoc在视觉上很吸引人。

我个人喜欢它的较长部分,即XML,因为我不需要关心引号字符,可以简单地粘贴XML。

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

例如,在某些情况下,您可能希望输出带有嵌入式变量的文本,而不必从文件中获取并运行模板替换。Heredoc允许您不必转义引号,因此您看到的文本就是您输出的文本。显然有一些负面影响,例如,你不能缩进你的heredoc,这在某些情况下会令人沮丧,特别是如果你是一个统一语法的坚持者,就像我一样。

对我来说,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";

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

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

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

  • 当字符串是像'no variables here'这样的常量时,使用引号
  • 当我可以将字符串放在单行上并需要变量插值或嵌入单引号"Today is ${user}'s birthday"时,会引用
  • 在这里文档用于需要格式化和变量插值的多行字符串。
首先,所有的原因都是主观的。

这更像是一个品味问题,而不是原因

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

由于提高了可读性和可维护性,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不会突出显示该语言的语法,这导致可读性差,维护更困难。

更新的答案你的常识

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

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