奇怪的PHP语法

10

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

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

endif;

出乎意料,它也能毫无错误地运行。有人可以给我解释一下吗?

感谢大家:)


5
正如下面的回答所说,这是一种可替代的语法。在我看来,这样写非常难读,请避免在自己的代码中使用这种语法。 - nickf
3
在模板中经常会出现这种语法,即在<?php?>中插入HTML代码。即使在这种情况下,这种语法也很难阅读和理解,并且应该尽量避免使用。 - o0'.
1
@Lo'oris,我不同意你的观点。如果你问我,在模板中使用它可以提高可读性:请参见https://dev59.com/GnE85IYBdhLWcg3waCxT#2789008以获取示例。 - Marijn Huizendveld
1
我同意那些反对使用它的人。即使在模板中,正如Lo'oris所提到的,它几乎对可读性没有任何帮助。但我对它的主要问题是,我还没有找到一个可以突出显示匹配的IDE,例如if/endif或foreach/endforeach或任何其他替代语法标记。仅仅因为这个原因,它就应该被避免。Netbeans甚至可以突出显示跨越<?php ?>块的匹配括号,但它不知道如何处理替代语法。我认为,这个问题被问到,进一步证明了应该避免使用它,以防止混淆。 - aw crud
5个回答

28

这是PHP的控制结构的替代语法

你的代码片段等同于:

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

通常情况下:
if(cond):
...
...
endif;

是相同的

if(cond) {
...
...
}

1
我相信你...但是为什么在撒旦的名字下你想要这样做呢? - BIBD
2
@CodeSlave:如果你嵌入HTML代码的话,它看起来会更漂亮。 - Daniel

14

这种语法风格在嵌入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>
<? } ?>

冗长的结束标签使得跟踪嵌套代码块变得稍微容易一些,尽管这还是大部分取决于个人喜好。


5

1
你可以在PHP手册的控制结构的替代语法中阅读相关内容。重新格式化后,你发布的代码如下所示:
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;

0

这相当于:

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';
}

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


这种语法在模板中非常有用,因此在我看来是毋庸置疑的。或者至少不是显然的;) - Marijn Huizendveld

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接