Разница между if () {} и if (): endif;

Есть ли различия между …

if ($value) { } 

…а также…

 if ($value): endif; 

?

Они те же, но второй отличный, если у вас есть MVC в коде и не хотите иметь много эхо в вашем коде. Например, в моих .phtml файлах (Zend Framework) я напишу что-то вроде этого:

 <?php if($this->value): ?> Hello <?php elseif($this->asd): ?> Your name is: <?= $this->name ?> <?php else: ?> You don't have a name. <?php endif; ?> 

Я лично очень ненавижу альтернативный синтаксис. Одна из приятных особенностей брекетов заключается в том, что большинство IDE, vim и т. Д. Имеют подсветку. В моем текстовом редакторе я могу дважды щелкнуть фигурку, и она выделит весь фрагмент, чтобы я мог видеть, где он заканчивается и начинается очень легко.

Я не знаю ни одного редактора, который может выделить endif, endforeach и т. Д.

Я думаю, все это говорит:

этот альтернативный синтаксис отлично подходит для улучшения удобочитаемости (как для PHP, так и для HTML!) в ситуациях, когда у вас есть их сочетание.

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

При смешивании HTML с PHP альтернативный sytnax гораздо легче читать. В обычных PHP-документах должен использоваться традиционный синтаксис.

В нашей компании предпочтительным способом обработки HTML является:

 <? if($condition) { ?> HTML content here <? } else { ?> Other HTML content here <? } ?> 

В конце концов, это действительно вопрос выбора одного и придерживаться его.

Вот где вы можете найти его в официальной документации: PHP: Альтернативный синтаксис для структур управления

Они действительно одинаковы, функционально.

Но если endif слишком далеко от корреспондента, if я думаю, что гораздо лучше использовать для него ссылку. Просто чтобы вы могли легко найти, где он был открыт. Независимо от того, на каком языке он:

 if (my_horn_is_red or her_umbrella_is_yellow) { // ... // let's pretend this is a lot of code in the middle foreach (day in week) { sing(a_different_song[day]); } // ... } //if my_horn_is_red 

Это действительно относится к любой аналогичной «закрывающей вещи»! 😉

Кроме того, в целом редакторы работают лучше с фигурными скобками, в том смысле, что они могут указать вам, где он был открыт. Но даже это не делает дескриптивные комментарии менее достоверными.

Я думаю, что это действительно зависит от вашего личного стиля кодирования. Если вы привыкли к C ++, Javascript и т. Д., Вам может быть удобнее использовать синтаксис {}. Если вы привыкли к Visual Basic, вы можете использовать if: endif; синтаксис.

Я не уверен, что можно окончательно сказать, что читать легче, чем другое – это личное предпочтение. Обычно я делаю что-то вроде этого:

 <?php if ($foo) { ?> <p>Foo!</p><?php } else { ?> <p>Bar!</p><?php } // if-else ($foo) ?> 

Легче ли читать, чем:

 <?php if ($foo): ?> <p>Foo!</p><?php else: ?> <p>Bar!</p><?php endif; ?> 

это вопрос мнения. Я понимаю, почему некоторые чувствовали, что второй способ проще – но только если вы не программировали в Javascript и C ++ всю свою жизнь. 🙂

Я думаю, что это особенно ясно, когда вы используете сочетание if , s и foreach es в сценариях вида:

 <?php if ( $this->hasIterable ): ?> <h2>Iterable</h2> <ul> <?php foreach ( $this->iterable as $key => $val ):?> <?php for ( $i = 0; $i <= $val; $i++ ): ?> <li><?php echo $key ?></li> <?php endfor; ?> <?php endforeach; ?> </ul> <?php elseif ( $this->hasScalar ): ?> <h2>Scalar</h2> <?php for ( $i = 0; $i <= $this->scalar; $i++ ): ?> <p>Foo = Bar</p> <?php endfor; ?> <?php else: ?> <h2>Other</h2> <?php if ( $this->otherVal === true ): ?> <p>Spam</p> <?php else: ?> <p>Eggs</p> <?php endif; ?> <?php endif; ?> 

в отличие от:

 <?php if ( $this->hasIterable ){ ?> <h2>Iterable</h2> <ul> <?php foreach ( $this->iterable as $key => $val ){?> <?php for ( $i = 0; $i <= $val; $i++ ){ ?> <li><?php echo $key ?></li> <?php } ?> <?php } ?> </ul> <?php } elseif ( $this->hasScalar ){ ?> <h2>Scalar</h2> <?php for ( $i = 0; $i <= $this->scalar; $i++ ){ ?> <p>Foo = Bar</p> <?php } ?> <?php } else { ?> <h2>Other</h2> <?php if ( $this->otherVal === true ){ ?> <p>Spam</p> <?php } else { ?> <p>Eggs</p> <?php } ?> <?php } ?> 

Это особенно полезно для длинных контрольных операторов, где вы не сможете увидеть верхнюю декларацию из нижней скобки.

Я бы использовал первый вариант, если это вообще возможно, независимо от новой опции. Синтаксис является стандартным, и все это знают. Он также обратно совместим.

Оба они одинаковы.

Но: если вы хотите использовать PHP в качестве языка шаблонов в ваших файлах просмотра (V of MVC), вы можете использовать этот альтернативный синтаксис для различения кода PHP, написанного для реализации бизнес-логики (Controller и Model parts of MVC) и gui- логика. Конечно, это не обязательно, и вы можете использовать любой синтаксис, который вам нравится.

ZF использует этот подход.

Между двумя синтаксисами нет технической разницы. Альтернативный синтаксис не нов; он был поддержан, по крайней мере, еще в PHP 4 и, возможно, даже раньше.

Вы можете предпочесть альтернативную форму, потому что она явно указывает, какая структура управления заканчивается: в конце, например, может только закончить блок while , тогда как если вы столкнетесь с фигурной скобкой, это может закрыть что угодно.

Вы можете предпочесть традиционный синтаксис, хотя, если вы используете редактор, который имеет специальную поддержку фигурных скобок в других синтаксисах типа C. Например, Vim поддерживает несколько нажатий клавиш для навигации к соответствующим фигурным скобкам и к концам и концам блоков, разделенных фигурной скобкой. Альтернативный синтаксис нарушит эту функцию редактора.

Все зависит от того, лично ли я предпочитаю традиционный синтаксис с эхом и множеством отступов, так как его гораздо проще читать.

 <?php if($something){ doThis(); }else{ echo '<h1>Title</h1> <p>This is a paragraph</p> <p>and another paragraph</p>'; } ?> 

Я согласен, что синтаксис alt более чист с различными терминальными предложениями, но мне действительно трудно справляться с ними без помощи выделения текстового редактора, и я просто не привык видеть «сжатый» код следующим образом:

 <?php if( $this->isEnabledViewSwitcher() ): ?> <p class="view-mode"> <?php $_modes = $this->getModes(); ?> <?php if($_modes && count($_modes)>1): ?> <label><?php echo $this->__('View as') ?>:</label> <?php foreach ($this->getModes() as $_code=>$_label): ?> <?php if($this->isModeActive($_code)): ?> <strong title="<?php echo $_label ?>" class="<?php echo strtolower($_code); ?>"><?php echo $_label ?></strong>&nbsp; <?php else: ?> <a href="<?php echo $this->getModeUrl($_code) ?>" title="<?php echo $_label ?>" class="<?php echo strtolower($_code); ?>"><?php echo $_label ?></a>&nbsp; <?php endif; ?> <?php endforeach; ?> <?php endif; ?> </p> <?php endif; ?> 

Раньше я использовал фигурные скобки, но теперь я предпочитаю использовать этот короткий синтаксис из-за читаемости кода и доступности.

В конце концов вы просто не хотите искать следующую строку, а затем должны угадать, где она началась:

 <?php } ?> 

Технически и функционально они одинаковы.

Я думаю, что это вопрос предпочтения. Я лично использую:

 if($something){ $execute_something; } 

Раньше я использовал фигурные скобки для условий «if, else». Однако я нашел «if (xxx): endif;» является более смысловым, если код сильно обернут и более легко читается в любых редакторах.

Конечно, редакторы серии могут распознавать и выделять куски кода, когда выбраны фигурные скобки. Некоторые также хорошо справляются с «if (xxx): endif» (например, NetBeans)

Лично я бы рекомендовал «if (xxx): endif», но для проверки небольшого состояния (например, только одна строка кода) различий не так много.

Лично я предпочитаю делать это в двух отдельных разделах, но в пределах одного и того же PHP:

 <?php if(question1) { $variable_1=somehtml; } else{ $variable_1=someotherhtml; } if(question2) { $variable_2=somehtml2; } else{ $variable_2=someotherhtml2; } etc. $output=<<<HERE htmlhtmlhtml$variable1htmlhtmlhtml$varianble2htmletcetcetc HERE; echo $output; ?> 

Но может быть, это медленнее?

Я чувствую, что ни один из существующих ответов полностью не определяет ответ здесь, поэтому я собираюсь сформулировать свою собственную точку зрения. Функционально оба метода одинаковы. Если программист знаком с другими языками после синтаксиса Си, то они, скорее всего, будут чувствовать себя более комфортно с фигурными скобками, иначе если php станет первым языком, который они изучают, они будут чувствовать себя более комфортно с синтаксисом if endif , поскольку кажется ближе к правильному языку.

Если вы действительно серьезный программист и вам нужно быстро все проделать, я верю, что синтаксис фигурного скобки превосходен, потому что он экономит время ввода текста

 if(/*condition*/){ /*body*/ } 

в сравнении с

 if(/*condition*/): /*body*/ endif; 

Это особенно верно в отношении других циклов, скажем, foreach где вы в конечном итоге набрали дополнительные 10 символов. С фигурными скобками вам просто нужно ввести два символа, но для синтаксиса на основе ключевых слов вам нужно ввести целое дополнительное ключевое слово для каждого цикла и условного оператора.