26

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

我对么?

4

5 回答 5

23

谢天谢地,这个特性终于通过 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();
    }
}
于 2018-07-04T03:46:04.937 回答
11

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

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

不幸的是,我从来没有见过像你描述的那样的工具......


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

于 2010-02-21T12:54:43.480 回答
4

我刚刚为仍然想知道如何做到这一点的任何人发现了一个奇怪的解决方法。缩进开始 HEREDOC 的第一行。您的第二行,即 HEREDOC 的第一行,必须没有空格,所以将其保留为空行。之后开始一个新行,缩进它并编写你的代码。然后完成HEREDOC,再次没有空白。从视觉上看,除了 HEREDOC 的完成之外,您将缩进所有代码。Highlight + 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
于 2013-11-19T12:30:48.050 回答
3

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

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 mods,您的服务器将删除所有不必要的空格。

您可以对多行​​ 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 查询(使用 # 或 --)

于 2012-06-16T13:36:52.443 回答
0

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

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

于 2015-12-13T03:42:16.153 回答