HEREDOC 干扰代码缩进

HEREDOC interfering with code indentation

提问人:Pekka 提问时间:2/21/2010 最后编辑:Lightness Races in OrbitPekka 更新时间:7/4/2018 访问量:12888

问:

我喜欢 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 语法。但我想如果不为源文件编写一些预编译器,这是不可能的。

我说得对吗?

php heredoc

评论


答:

11赞 Pascal MARTIN 2/21/2010 #1

这也是我经常遇到的问题:当我使用 heredoc 时代码缩进不好,我真的很喜欢 heredoc :-(

一个“更大的”问题是,当你选择一整段代码时,按“tab”(或IDE中的任何等效代码)来缩进它,因为你在它周围添加了一个条件或任何东西......它破坏了 heredoc 字符串:您必须手动取消缩进它们:-(

不幸的是,我从未见过像你所描述的工具......


我想,一个解决方案是将 heredoc 字符串放在另一个文件中,并包含它——include like 可以正常缩进;但这也意味着要加载一个文件,这将使代码不那么清晰。

评论

0赞 Pekka 2/21/2010
是的,包含另一个文件会带来太多的混乱......我正在考虑为 CSS 构建一个像 LESS 这样的“预编译器”,但似乎付出了太多的努力(和额外的步骤)而收获太少。太糟糕了!
7赞 Pascal MARTIN 2/21/2010
使用某种“预编译器”也意味着你编写和看到的代码(在你的IDE/编辑器中)不是被执行的代码 - 这将成为混乱的根源,总有一天......
0赞 TheOperator 11/9/2016
题外话:我建议使用具有良好解析能力的编辑器来自动缩进代码。好的 IDE(比如 PhpStorm)不允许你缩进 HEREDOC 结束标记,即使在显式编写选项卡时也是如此。
3赞 Pedro L. 6/16/2012 #2

您无法识别 PHP。这是我的解决方法:heredocsnowdocs

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 查询(使用 # 或 --)

评论

2赞 Tag 10/28/2014
这种方法的缺点是必须对双引号进行转义。
4赞 Wes Cutshall 11/19/2013 #3

我刚刚发现了一种奇怪的解决方法,供任何仍然想知道如何做到这一点的人使用。缩进开始 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

评论

2赞 Mark E. Haase 9/26/2014
我把这个答案回滚到修订版 1。@bgs所做的编辑完全破坏了韦斯试图表达的整个观点。
0赞 Chiedo 12/13/2015 #4

我写了一个函数,可以让你随心所欲地缩进。这实际上是一个非常简单的函数。https://github.com/chiedolabs/moon-walk-php

我喜欢它,因为我的代码以这种方式保持干净。

评论

0赞 Martijn Pieters 12/13/2015
我可以请您查看以下元帖子吗?如何提供个人开源库?
3赞 TheOperator 11/9/2016
GitHub 页面上的 With moonwalk: 示例格式不正确。HEREDOC 的结束标记必须出现在行的开头,不能缩进。
30赞 Jeff Puckett 7/4/2018 #5

谢天谢地,这个功能终于通过 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();
    }
}

评论

3赞 Manngo 10/5/2022
在 php.net/manual/en/ 的文档中......