Странный синтаксис PHP

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

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

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

Спасибо всем 🙂

Этот стиль синтаксиса чаще используется при встраивании в 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> <? } ?> 

Многословные концевые теги облегчают отслеживание вложенных блоков кода, хотя это по-прежнему в основном личные предпочтения.

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

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

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

В целом:

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

такое же, как

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

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

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

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

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

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

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