【问题标题】:HEREDOC interfering with code indentationHEREDOC 干扰代码缩进
【发布时间】:2011-01-19 08:05:40
【问题描述】:

我喜欢 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


    【解决方案1】:

    谢天谢地,这个功能终于通过 RFC 登陆 php 7.3:Flexible Heredoc and Nowdoc Syntaxes

    所以现在你的例子可以干净地写成:

    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();
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我将此答案回滚到修订版 1。@bgs 所做的编辑完全破坏了 Wes 试图提出的全部观点。
      【解决方案4】:

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

      您可以对多行​​ sql 查询使用相同的技术:

      function bar($sql, $id) {
          $q= "
             SELECT
               name
             , address
             , phone
             FROM users
             WHERE id = '$id' -- possible mysql inyection
             LIMIT 1
          ";
          $sql->query($q);
      }
      

      代码提高了可读性。它对性能没有影响,您可以注释复杂的 SQL 查询(使用 # 或 --)

      【讨论】:

      • 这种方法的缺点是必须转义双引号。
      【解决方案5】:

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

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

      很遗憾,我从未见过像您描述的那样的工具...


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

      【讨论】:

      • 是的,包括另一个文件会带来太多的混乱......我正在考虑为 CSS 构建一个像 LESS 这样的“预编译器”,但这似乎太费力了(而且是一个额外的步骤) 收益太少。太糟糕了!
      • 使用某种“预编译器”也意味着您编写和看到的代码 (在您的 IDE/编辑器中) 不是被执行的代码——这将是混乱的根源,总有一天......
      • 题外话:我建议使用具有良好解析能力的编辑器来自动缩进代码。好的 IDE(例如 PhpStorm)不会让您缩进 HEREDOC 结束标记,即使在显式编写选项卡时也是如此。
      猜你喜欢
      • 2022-11-15
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      • 2014-11-27
      • 1970-01-01
      • 2012-01-03
      相关资源
      最近更新 更多