在PHP中使用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' 双引号当我可以把字符串放在单行上,需要变量插值或嵌入单引号“今天是${user}的生日” 这里是需要格式化和变量插值的多行字符串的文档。
其他回答
对我来说,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' 双引号当我可以把字符串放在单行上,需要变量插值或嵌入单引号“今天是${user}的生日” 这里是需要格式化和变量插值的多行字符串的文档。
由于提高了可读性和可维护性,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;
一些ide会自动突出显示heredoc字符串中的代码——这使得在XML或HTML中使用heredoc在视觉上很吸引人。
我个人喜欢它的较长部分,即XML,因为我不需要关心引号字符,可以简单地粘贴XML。
首先,所有的原因都是主观的。 这更像是品味的问题,而不是原因。
就我个人而言,我发现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允许您不必转义引号,因此您看到的文本就是您输出的文本。显然有一些负面影响,例如,你不能缩进你的heredoc,这在某些情况下会令人沮丧,特别是如果你是一个统一语法的坚持者,就像我一样。
推荐文章
- 在PHP单元测试执行期间,如何在CLI中输出?
- 在PHP中使用heredoc的优势是什么?
- PHP中的echo, print和print_r有什么区别?
- 如何将XML转换成PHP数组?
- 如何将对象转换为数组?
- 从IP地址获取位置
- 获取数组值的键名
- HTTPS和SSL3_GET_SERVER_CERTIFICATE:证书验证失败,CA is OK
- PHP -获取bool值,当为false时返回false
- 在foreach中通过引用传递
- 如何触发命令行PHP脚本的XDebug分析器?
- 如何找出如果你使用HTTPS没有$_SERVER['HTTPS']
- 更好的方法检查变量为null或空字符串?
- 当使用Composer的开发/生产开关时,如何正确部署?
- 自动删除Laravel (Eloquent ORM)中的相关行