我喜欢HEREDOC语法,例如对于生成的HTML的边缘情况,不值得放入模板。
但是,唯一令我烦恼的是,内容和heredoc字符串的结束标记符合第一列。这搞砸了嵌套的代码布局:
class myclass
{
function __construct()
{
$a = some_code();
$b = some_more_code();
$x = <<<EOT
line1
line2
line3
line4
EOT;
$c = even_more_code();
$b = still_more_code();
...
...
...
你明白我的意思了。
现在使用正常的HEREDOC可能无法解决这个问题。有没有人解决这个问题?我的梦想是使用HEREDOC语法进行自动缩进。但我想如果不为源文件编写一些预编译器,这是不可能的。
我说错了吗?
答案 0 :(得分:11)
这也是我经常遇到的问题:当我使用heredoc时代码没有很好地缩进,我真的很喜欢heredoc: - (
“更大”的问题是,当您选择整个代码块时,按“tab”(或IDE 中的任何等效代码)更多地缩进它,因为您添加了条件或其他任何内容......它打破了heredoc字符串:你必须手动取消它们: - (
不幸的是,我从未见过像你所描述的任何工具......
我想,一个解决方案是将heredoc字符串放在另一个文件中,然后包含它 - 包含就像可以正常缩进;但它还意味着要加载一个文件,这会使代码不那么清晰。
答案 1 :(得分:6)
仅供参考,这不能解决您的问题,但Ruby编程语言支持缩进的heredoc。
您可能希望向PHP开发人员发送功能请求,并使用Ruby文档作为示例,以证明现有语言可以解决此问题,那么为什么不支持PHP呢?
答案 2 :(得分:3)
谢天谢地,此功能终于通过RFC:Flexible Heredoc and Nowdoc Syntaxes
登陆了php 7.3。所以现在您的示例可以清楚地写为:
class myclass
{
function __construct()
{
$a = some_code();
$b = some_more_code();
$x = <<<EOT
line1
line2
line3
line4
EOT;
$c = even_more_code();
$b = still_more_code();
}
}
答案 3 :(得分:2)
您无法在PHP中识别heredocs
或nowdocs
。这是我的解决方法:
function foo() {
$a = 123;
$b = 456;
$sum = $a + $b;
$html = "
<div>
<h1>sum a, b</h1>
Number a is $a, number b is $b<br>
a+b equals <b>$sum<b>
</div>
";
echo $html;
}
这会为生成的html代码添加空格,但如果使用mod_pagespeed
或类似的apache mod,则服务器将删除所有不需要的空格。
您可以对多行SQL查询使用相同的技术:
function bar($sql, $id) {
$q= "
SELECT
name
, address
, phone
FROM users
WHERE id = '$id' -- possible mysql inyection
LIMIT 1
";
$sql->query($q);
}
代码在可读性方面有所提高。它对性能没有影响,您可以评论compex SQL查询(使用#或 - )
答案 4 :(得分:1)
我刚刚发现一个奇怪的解决方法,任何人仍然想知道如何做到这一点。缩进启动HEREDOC的第一行。你的第二行,即HEREDOC的第一行,必须没有空格,所以把它留作空白行。之后开始一个新行,缩进并编写代码。然后完成HEREDOC,再没有空白区域。除了完成HEREDOC之外,您可以在视觉上获得所有代码缩进。突出显示+ TAB仍然是一个问题,但现在至少代码在控制循环等中更具可读性。
$html = <<< HTML //indented line
//leave this line empty
<div> //indented line
<div>$variable</div> //indented line
</div> //indented line
HTML; //no white space, not indented
答案 5 :(得分:0)
我写了一个允许你按照自己的意愿缩进的功能。这实际上是一个非常简单的功能。 https://github.com/chiedolabs/moon-walk-php
我喜欢它,因为我的代码保持干净。