提问人:Pekka 提问时间:2/21/2010 最后编辑:Lightness Races in OrbitPekka 更新时间:7/4/2018 访问量:12888
HEREDOC 干扰代码缩进
HEREDOC interfering with code indentation
问:
我喜欢 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 语法。但我想如果不为源文件编写一些预编译器,这是不可能的。
我说得对吗?
答:
这也是我经常遇到的问题:当我使用 heredoc 时代码缩进不好,我真的很喜欢 heredoc :-(
一个“更大的”问题是,当你选择一整段代码时,按“tab”(或IDE中的任何等效代码)来缩进它,因为你在它周围添加了一个条件或任何东西......它破坏了 heredoc 字符串:您必须手动取消缩进它们:-(
不幸的是,我从未见过像你所描述的工具......
我想,一个解决方案是将 heredoc 字符串放在另一个文件中,并包含它——include like 可以正常缩进;但这也意味着要加载一个文件,这将使代码不那么清晰。
评论
您无法识别 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 代码添加空格,但如果您使用或类似的 apache mod,您的服务器将删除所有不必要的空格。mod_pagespeed
您可以对多行 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 查询(使用 # 或 --)
评论
我刚刚发现了一种奇怪的解决方法,供任何仍然想知道如何做到这一点的人使用。缩进开始 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
评论
我写了一个函数,可以让你随心所欲地缩进。这实际上是一个非常简单的函数。https://github.com/chiedolabs/moon-walk-php
我喜欢它,因为我的代码以这种方式保持干净。
评论
谢天谢地,这个功能终于通过 RFC 登陆了 php 7.3:灵活的 Heredoc 和 Nowdoc 语法
所以现在你的例子可以干净利落地写成:
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();
}
}
评论