【问题标题】:Strange PHP syntax奇怪的 PHP 语法
【发布时间】:2010-05-07 13:31:36
【问题描述】:

我已经在PHP 上工作了一段时间,但今天当我看到这个时,它对我来说是新的:

if(preg_match('/foo.*bar/','foo is a bar')):
        echo 'success ';
        echo 'foo comes before bar';

endif;

令我惊讶的是,它也可以毫无错误地运行。谁能赐教?

谢谢大家:)

【问题讨论】:

  • 正如下面的答案所说,这是一种替代语法。阅读 IMO 也非常痛苦,请在您自己的代码中避免这种情况。
  • 这种语法在你经常打开和关闭并且中间使用html的时候用在模板中。即使在这些情况下,它也是可怕且难以理解的,应该完全避免。
  • @Lo'oris,我不同意你的看法。如果您问我,在模板中使用它可以提高可读性:例如,请参阅 stackoverflow.com/questions/2788891/strange-php-syntax/…
  • 我同意那些反对它的人。即使在模板中,正如 Lo'oris 所提到的,它对可读性几乎没有任何作用。但我遇到的主要问题是我没有找到一个 IDE 突出匹配 if/endif 或 foreach/endforeach 或任何其他替代语法标签。仅出于这个原因,就应该避免它。 Netbeans 将突出显示匹配的大括号,即使它们跨越 块,但它不知道如何使用备用大括号。我认为提出这个问题的事实进一步证明了应该避免它,以防止混淆。

标签: php syntax if-statement alternate control-structure


【解决方案1】:

这是 PHP 的Alternative syntax for control structures

你的 sn-p 相当于:

if(preg_match('/foo.*bar/','foo is a bar')) {
        echo 'success ';
        echo 'foo comes before bar';
}

一般:

if(cond):
...
...
endif;

相同
if(cond) {
...
...
}

【讨论】:

  • 我相信你……但凭着撒旦的名义,你为什么要这么做?
  • @CodeSlave:我想如果你嵌入 html 代码看起来会更好。
【解决方案2】:

这种语法风格在嵌入 HTML 时更常用,尤其是对于模板/显示逻辑。以这种方式嵌入时,它比花括号语法更易于阅读。

<div>
<? if ($condition): ?>
  <ul>
    <? foreach($foo as $bar): ?>
        <li><?= $bar ?></li>
    <? endforeach ?>
  </ul>
<? endif ?>
</div>

对比:

<div>
<? if ($condition) { ?>
  <ul>
    <? foreach($foo as $bar) { ?>
      <li><?= $bar ?></li>
    <? } ?>
  </ul>
<? } ?>

详细的结束标记使跟踪嵌套代码块变得更容易一些,尽管它仍然主要是个人喜好。

【讨论】:

    【解决方案3】:

    http://php.net/manual/en/control-structures.alternative-syntax.php

    适用于 ifforwhileforeachswitch。可以非常方便地混合 PHP 和 HTML。

    【讨论】:

      【解决方案4】:

      您可以在 PHP 手册中的 Alternative syntax for control structures 中阅读有关它的信息。重新格式化后,您发布的代码如下所示:

      if (preg_match('/foo.*bar/','foo is a bar')):
          echo 'success ';
          echo 'foo comes before bar';
      endif;
      

      这段代码相当于:

      if (preg_match('/foo.*bar/','foo is a bar')) {
          echo 'success ';
          echo 'foo comes before bar';
      }
      

      这种语法也适用于其他几种控制结构。

      if ( condition ):
        // your if code
      elseif ( other_condition ):
        // optional elseif code
      else:
        // optional else code
      endif;
      
      while ( condition ):
        // your while code
      endwhile;
      
      for ( condition ):
        // your for code
      endfor;
      
      foreach ( condition ):
        // your foreach code
      endforeach;
      
      switch ( condition ):
        // your switch code
      endswitch;
      

      【讨论】:

        【解决方案5】:

        相当于:

        if(preg_match('/foo.*bar/','foo is a bar')):
         echo 'success ';
         echo 'foo comes before bar';
        endif;
        

        相当于:

        if(preg_match('/foo.*bar/','foo is a bar')){
            echo 'success ';
            echo 'foo comes before bar';
        }
        

        支持非标准条件语法的智慧显然值得怀疑。

        【讨论】:

        • 这种语法在模板中非常有用,因此 ihmo 没有问题。或者至少不明显;)
        猜你喜欢
        • 2013-08-10
        • 1970-01-01
        • 2013-09-05
        • 2017-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多