Есть ли различия между...
if ($value) {
}
... и...
if ($value):
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 pretend this is a lot of code in the middle
foreach (day in week) {
sing(a_different_song[day]);
}
// ...
} //if my_horn_is_red
Это действительно относится к любой аналогичной "закрывающей вещи"!;)
Кроме того, в целом редакторы лучше справляются с фигурными скобками, в том смысле, что они могут указывать на то, где они были открыты. Но даже это не делает дескриптивные комментарии менее достоверными.
Я думаю, что это действительно зависит от вашего личного стиля кодирования. Если вы привыкли к С++, 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 и С++ всю свою жизнь.:)
Я думаю, что он особенно ясен, когда вы используете сочетание сценариев 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 } ?>
Это особенно полезно для длинных контрольных операторов, где вы не сможете увидеть верхнее объявление из нижней скобки.
Я бы использовал первый вариант, если это вообще возможно, независимо от новой опции. Синтаксис является стандартным, и все это знают. Он также обратно совместим.
Оба одинаковы.
Но: Если вы хотите использовать PHP в качестве языка шаблонов в ваших файлах просмотра (V of MVC), вы можете использовать этот альтернативный синтаксис для различения php-кода, написанного для реализации бизнес-логики (Controller и Model parts of MVC) и gui-logic. Конечно, это не обязательно, и вы можете использовать любой синтаксис, который вам нравится.
ZF использует этот подход.
Существует нет технической разницы между двумя синтаксисами. Альтернативный синтаксис не нов; он был поддержан, по крайней мере, еще в PHP 4 и, возможно, даже раньше.
Вы можете предпочесть альтернативную форму, потому что она явно указывает, какая структура управления заканчивается: endwhile
, например, может только разорвать блок while
, тогда как если вы столкнетесь с фигурной скобкой, это может закрыть что-либо.
Вы можете предпочесть традиционный синтаксис, однако, если вы используете редактор, который имеет специальную поддержку фигурных скобок в других синтаксисах типа C. Например, Vim поддерживает несколько нажатий клавиш для навигации к соответствующим фигурным скобкам и к концам и концам блоков, разделенных фигурной скобкой. Альтернативный синтаксис нарушит эту функцию редактора.
Все зависит, лично я предпочитаю традиционный синтаксис с эхом и множеством отступов, так как его гораздо проще читать.
<?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>
<?php else: ?>
<a href="<?php echo $this->getModeUrl($_code) ?>" title="<?php echo $_label ?>" class="<?php echo strtolower($_code); ?>"><?php echo $_label ?></a>
<?php endif; ?>
<?php endforeach; ?>
<?php endif; ?>
</p>
<?php endif; ?>
Я использовал фигурные скобки, но теперь я предпочитаю использовать этот короткий синтаксис из-за читаемости кода и доступности.
В конце концов вы просто не хотите искать следующую строку, а затем должны угадать, где она началась:
<?php } ?>
Технически и функционально они одинаковы.
Я думаю, что это вопрос предпочтения. Я лично использую:
if($something){
$execute_something;
}
Лично я предпочитаю делать это в двух отдельных разделах, но внутри одного и того же 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;
?>
Но может быть, это медленнее?
Я использовал фигурные скобки для условий "if, else". Однако я нашел "if (xxx): endif;" более семантичен, если код сильно обернут и легче читать в любых редакторах.
Конечно, много редакторов могут распознавать и выделять куски кода при выборе фигурных скобок. Некоторые также хорошо справляются с "if (xxx): endif" (например, NetBeans)
Лично я бы рекомендовал "if (xxx): endif", но для проверки небольшого состояния (например, только одна строка кода) различий не много.
Я чувствую, что ни один из существующих ответов полностью не определяет ответ здесь, поэтому я собираюсь сформулировать свою собственную точку зрения. Функционально оба метода одинаковы. Если программист знаком с другими языками после синтаксиса Си, то они, скорее всего, будут чувствовать себя более комфортно с фигурными скобками, иначе если php станет первым языком, который они изучают, они будут чувствовать себя более комфортно с помощью if
endif
синтаксис, поскольку он кажется ближе к правильному языку.
Если вы действительно серьезный программист и вам нужно быстро все проделать, я верю, что синтаксис фигурных фигурных скобок превосходен, потому что он экономит время ввода
if(/*condition*/){
/*body*/
}
по сравнению с
if(/*condition*/):
/*body*/
endif;
Это особенно актуально для других циклов, скажем, foreach
, где вы можете ввести еще 10 символов. С фигурными скобками вам просто нужно ввести два символа, но для синтаксиса на основе ключевых слов вы должны ввести целое дополнительное ключевое слово для каждого цикла и условного оператора.