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

159

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

if ($value) {

}

...и...

if ($value):

endif;

?

Алекс
источник
Второй путь существует с PHP4, если не раньше.
Миль
см. также: stackoverflow.com/questions/381259/…
Jacco
1
Большинство ответов на самом деле не касаются основного вопроса : что работает лучше, когда вы смотрите на какой-то код, и есть много закрывающих команд, таких как } } } }(что также можно сделать endif), и вы хотите знать, где они были открыты? Ответ ни один . По сути, это первое «правило» принципов проектирования Python .
cregox 15.12.14
7
Очевидно, что {}это лучше и : endif;является злодеянием, которого бы не было, если бы жизнь была справедливой. С хорошим текстовым редактором у вас будет сочетание клавиш для соответствующих скобок, чтобы перейти от открытия к закрытию или наоборот. Ничего подобного не существует и не может существовать для отвратительного : endif;синтаксиса.
developerwjk
3
@developerwjk, как это может никогда не существовать?
Алекс

Ответы:

177

Они одинаковы, но второе замечательно, если в вашем коде есть 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; ?>
Thomaschaaf
источник
38
@alex Это будет работать и с фигурными скобками, но, по крайней мере, лично я нахожу этот способ более понятным в подобных вещах. Потому что вы знаете, что это конец if, а не конец какого-то цикла или что-то еще. Думаю, у вас есть конец и конец или что-то подобное тоже.
Свиш
10
Я бы не стал использовать <? =?>, Потому что он не поддерживается на всех серверах, особенно на виртуальных хостингах, которые не позволяют менять php.ini.
Сики Лин
2
Подходящая точка <php endif; ?> - вы можете точно сказать, что заканчивается даже со многими строками HTML между предыдущим if / else и этим оператором.
Фентон
7
почему "второй класс хорош, если вы не хотите, чтобы в вашем коде было много эха"? Я думаю, что то же самое для традиционного синтаксиса {}. Никакого дополнительного эха не требуется <?php if(...){ ?> ... <?php }else{ ?> ... <?php } ?>. В чем разница <?php if(...): ?> ... <?php else: ?> ... <?php endif ?>?
Ситху
9
Не уверен, почему этот ответ самый высокий, так как это не лучший пример (вы можете добиться того же самого с помощью фигурных скобок).
Рейнир Капер
69

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

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

dprevite
источник
11
Предполагается, что это будет использоваться в шаблонах PHP, где начало и конец блока разделены фрагментом иностранного языка. Если ваша IDE понимает PHP достаточно хорошо, чтобы разобрать его, она также должна выделяться endifкак конец блока. Если этого не произойдет, вы ничего не купите с помощью, так }как в любом случае это не будет соответствовать.
Павел Минаев
2
Большинство ide (по крайней мере те, которые я использовал) только выделяют {}
AntonioCS
11
Netbeans 7.x с радостью подчеркивает соответствие endforeach, endif и т. Д.
Джонатан Дэй
@Г-н. Минаев: Считыватель скобок будет анализироваться правильно, вероятно, в 98% случаев, даже если в нем есть сторонний код. Он потерпит неудачу только тогда, когда внутри него будет эзотерическая скобка «открывающий, но не закрывающий код». Да, это случается, но это случается редко. Почему вы думаете, что комплекс "конец-что угодно"; парсерный подход пойдет лучше практически, чем простое решение?
PatlaDJ
Я думаю, что наиболее важным моментом является описательность , когда это необходимо. Таким образом, мы можем легко найти, где он был открыт, независимо от того, какой инструмент нам может понадобиться. Особенно актуально для PHP, который время от времени нужно видеть, используя самые упрощенные редакторы.
Cregox 15.12.14
49

Я думаю, что это сказать все

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

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

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


источник
7
+1, Хороший ответ о том, какова его цель. Лично я думаю, что это бессмысленное дополнение к уже загроможденному языку.
Draemon
29

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

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

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

gahooa
источник
Спасибо - я обновил этот ответ. Это немного бьет вокруг куста, но может помочь.
gahooa
Кого вы имеете в виду, когда говорите «наш»?
Странное мышление
+1 за то, что избегал чрезмерных эхо-операторов и экранированных кавычек. :)
Джон Макколлум
ОШИБКА:<?php if(TRUE){?> test <?php }?> <?php else{ ?> test2 <?php }?>
Юша Алеауб
13

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

Но если 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

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

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

cregox
источник
1
согласитесь, это намного лучше - вместо того, чтобы вводить endif - вы можете сказать, что на самом деле выполняет условие if.
cartalot
@cartalot, возможно, было бы даже неплохо встроить язык (как необязательный закрывающий аргумент именованного блока), чтобы у нас могли быть ошибки при закрытии неправильных блоков в неправильных местах! :)
Cregox
9

Я думаю, что это особенно ясно, когда вы используете сочетание ifs, fors и foreaches в скриптах вида:

<?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 } ?>

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

Harry Mustoe-Playfair
источник
7

Я думаю, что это действительно зависит от вашего личного стиля кодирования. Если вы привыкли к 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 ++ всю свою жизнь. :)

livefree75
источник
1
Нет, скобки объективно легче читать (если не использовать египетскую версию). Даже если вы делаете скобки так, чтобы они шли как египтянин, его легче читать, чем синтаксис VB, потому что современные текстовые редакторы будут иметь функцию сопоставления скобок, которая поможет вам перейти от открывающей к закрывающей скобке или наоборот. Нет никакого способа, которым они могли бы иметь функцию сопоставления синтаксиса VB. Также вы должны рассмотреть вопрос о вложенности, и VB с треском проваливается на этом.
developerwjk
5

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

Пауло
источник
5

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

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

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

Итай Моав -Малимовка
источник
5

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

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

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

Роб Кеннеди
источник
3

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

<?php } ?>

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

Bondt
источник
1
Хороший текстовый редактор будет иметь ярлык для соответствия скобкам, чтобы вы могли начать с него. Это endif;будет трудно найти начало, потому что у них не будет подобной функции для этого, а код в стиле VB не будет хорошо вложен.
developerwjk
3

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

<?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; ?>
И Ян
источник
2

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


источник
Я использую это в моих шаблонах представления.
Алекс
2

Лично я предпочитаю делать это в двух отдельных разделах, но в одном 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;

?>

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

Хенрик
источник
1

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

if($something){
       $execute_something;
}
Серхио Родригес
источник
1
если бы вы прочитали всю ветку: предпочтителен альтернативный синтаксис и намного <em> чище </ em> при использовании шаблонов или использовании иностранного языка в представлениях php
Юрай Блахунка
1

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

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

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

Аарон Чен
источник
1

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

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

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

по сравнению с

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

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

Андрей
источник