Разница между if () {} и if (): endif; - PullRequest
151 голосов
/ 19 февраля 2009

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

if ($value) {

}

... и ...

if ($value):

endif;

Ответы [ 18 ]

167 голосов
/ 19 февраля 2009

Они одинаковы, но второе замечательно, если в вашем коде 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; ?>
66 голосов
/ 21 марта 2009

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

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

44 голосов
/ 15 июня 2009

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

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

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

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

28 голосов
/ 19 февраля 2009

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

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

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

10 голосов
/ 14 апреля 2011

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

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

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

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

10 голосов
/ 19 февраля 2009

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

7 голосов
/ 15 июля 2013

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

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

7 голосов
/ 14 марта 2012

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

5 голосов
/ 19 февраля 2009

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

5 голосов
/ 19 февраля 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...