Странный синтаксис PHP - PullRequest
10 голосов
/ 07 мая 2010

Я уже некоторое время работаю над PHP, но сегодня, когда я увидел это, это стало для меня новым:

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

endif;

К моему удивлению, он также работает без ошибок. Кто-нибудь может просветить меня?

Спасибо всем:)

Ответы [ 5 ]

28 голосов
/ 07 мая 2010

Это PHP Альтернативный синтаксис для структур управления .

Ваш фрагмент эквивалентен:

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

В целом:

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

совпадает с

if(cond) {
...
...
}
14 голосов
/ 07 мая 2010

Этот стиль синтаксиса чаще используется при встраивании в 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 голосов
/ 07 мая 2010

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

Работает для if, for, while, foreach и switch. Может быть очень удобно для смешивания PHP и HTML.

1 голос
/ 07 мая 2010

Вы можете прочитать об этом в Альтернативный синтаксис для структур управления в руководстве по 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 голосов
/ 07 мая 2010

Это эквивалент:

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

Мудрость поддержки нестандартного условного синтаксиса явно сомнительна.

...