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

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

if ($value) {

}

... и...

if ($value):

endif;

?

Ответ 1

Они те же, но второй отличный, если у вас есть 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; ?>

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Ответ 6

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

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

if (my_horn_is_red or her_umbrella_is_yellow)
{

    // ...

    // let pretend this is a lot of code in the middle

    foreach (day in week) {
        sing(a_different_song[day]);
    }

    // ...

} //if my_horn_is_red

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

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

Ответ 7

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

Ответ 8

Я думаю, что он особенно ясен, когда вы используете сочетание сценариев if s, for и 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 } ?>

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

Ответ 9

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

Ответ 10

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

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

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

Ответ 11

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

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

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

Ответ 12

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

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

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

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

Ответ 13

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

Ответ 14

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

<?php } ?>

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

Ответ 15

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

if($something){
       $execute_something;
}

Ответ 16

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

?>

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

Ответ 17

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

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

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

Ответ 18

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

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

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

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

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

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