HEREDOC干扰代码缩进

时间:2010-02-21 12:37:56

标签: php heredoc

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

我说错了吗?

6 个答案:

答案 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中识别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代码添加空格,但如果使用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

我喜欢它,因为我的代码保持干净。