Різниця між if () {} та if (): endif;


159

Чи є різниці між ...

if ($value) {

}

... і ...

if ($value):

endif;

?


Другий шлях існує з PHP4, якщо не раніше.
Майлз

дивіться також: stackoverflow.com/questions/381259/…
Jacco

1
Більшість відповідей насправді не стосуються основної суті : що краще працює, коли ви дивитесь на якийсь код, і є багато команд закриття, таких як } } } }(що також можна зробити endif), і ви хочете знати, де вони були відкриті? Відповідь - ні . Це в основному перше «правило» принципів дизайну пітона .
Крегокс

7
Очевидно, {}це краще і : endif;є злодіяння, якого не було б, якби життя було справедливим. З хорошим текстовим редактором у вас буде комбінація клавіш для відповідних дужок, щоб перейти від відкриття до закриття або навпаки. Нічого такого не існує і ніколи не може існувати для огидного : endif;синтаксису.
developerwjk

3
@developerwjk як це могло ніколи не існувати?
alex

Відповіді:


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

38
@alex Він також буде працювати з фігурними дужками, але, принаймні, особисто я вважаю такий спосіб яснішим у таких речах. Тому що ви знаєте, що це кінець if, а не кінець певного циклу чи чогось іншого. Подумайте, що у вас є endfor and endtime або щось подібне теж.
Свиш

10
Я б не використовував <? =?>, Оскільки він підтримується не на всіх серверах, особливо на спільних хостингах, які не дозволяють змінювати php.ini.
Siqi Lin

2
Відповідна точка <<php endif; ?> - Ви можете точно сказати, що закінчується навіть багатьма рядками HTML між попереднім if / else та цим твердженням.
Фентон

7
чому "другий чудовий, якщо ви не хочете мати багато відлуння у своєму коді"? Я думаю, що це теж саме для традиційного синтаксису {}. Ніякого додаткового відлуння не потрібно <?php if(...){ ?> ... <?php }else{ ?> ... <?php } ?>. У чому різниця <?php if(...): ?> ... <?php else: ?> ... <?php endif ?>?
Сіту

9
Не впевнений, чому ця відповідь є найвищою, оскільки це не чудовий приклад (ви можете досягти точно такого ж за допомогою фігурних дужок).
Реньє Капер

69

Я особисто дуже ненавиджу альтернативний синтаксис. Одна приємна річ щодо брекетів - це те, що у більшості IDE, vim тощо є підсвічування дужок. У своєму текстовому редакторі я можу двічі клацнути на дужці, і це виділить цілий фрагмент, щоб я міг бачити, де він закінчується і починається дуже легко.

Я не знаю жодного редактора, який може висвітлити endif, endforeach тощо.


11
Це передбачається використовувати в шаблонах PHP, де початок і кінець блоку розділені шматочком іноземної мови. Якщо ваш IDE розуміє PHP досить добре, щоб проаналізувати це, він також повинен виділитися endifяк кінець блоку належним чином. Якщо це не так, ви нічого не купуєте, використовуючи, }як це все одно не збігатиметься.
Павло Мінаєв

2
Більшість ідей (принаймні тих, кого я використав) лише виділяють {}
AntonioCS

11
Netbeans 7.x із задоволенням підкреслює відповідність endforeach, endif тощо
Jonathan Day

@Містер. Мінаєв: Матч для дужок буде правильно розбиратись, ймовірно, у 98% випадків, навіть там є закордонний код. Він вийде з ладу лише тоді, коли всередині нього є езотерична дужка "відкриття, але не закриття коду". Так, трапляється, але це трапляється рідко. Чому ви вважаєте, що складний "кінець-що-небудь"; підхід парсера зробить практично краще, ніж просте рішення?
PatlaDJ

Я думаю, що найважливішим моментом є описовий опис , коли це потрібно. Тож ми можемо легко знайти, де він був відкритий, незалежно від того, який інструмент нам може знадобитися. Особливо це стосується PHP, який час від часу вам потрібно бачити, використовуючи найпростіші редактори.
Крегокс

49

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

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

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

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


7
+1, приємна відповідь, яка його мета. Особисто я вважаю, що це безглуздо доповнення до вже захаращеної мови.
Draemon

29

У нашій компанії кращим способом обробки HTML є:

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

Зрештою, це насправді питання вибору одного та дотримання його.


Дякую - я оновив цю відповідь. Він трохи б’є навколо куща, але може допомогти.
gahooa

Кого ви маєте на увазі, коли говорите "наше"?
Відмінна думка

+1 для уникнення надмірних ехо-заяв та уникнути цитат. :)
Джон Макколлум

ПОМИЛКА:<?php if(TRUE){?> test <?php }?> <?php else{ ?> test2 <?php }?>
Yousha Aleayoub

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

Це насправді стосується будь-якої аналогічної «закриваючої речі»! ;)

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


1
погодьтеся, це набагато краще - замість того, щоб вводити endif - ви можете сказати, що насправді виконується умова if.
Картало

@cartalot, можливо, це було б навіть приємно, щоб вбудована мова (як необов'язковий аргумент закриття найменування-блоку), тому ми можемо мати помилки щодо закриття неправильних блоків у неправильних місцях! :)
Крегокс


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

Це особливо корисно для тривалих операцій керування, де ви, можливо, не зможете побачити верхню заяву з нижньої дужки.


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 ++. :)


1
Ні, дужки об'єктивно легше читати (коли не використовується єгипетська версія). Навіть якщо ви робите дужки такими, що вони ходять як єгипетські, її легше читати, ніж синтаксис VB, оскільки сучасні текстові редактори матимуть функцію узгодження дужок, щоб перенести вас від відкриття до закриття дужки або навпаки. Ні в якому разі вони не можуть мати функцію узгодження синтаксису VB. Крім того, у вас є гніздування, щоб розглянути, і VB нещасно не вдається на цьому.
developerwjk

5

Я б використав перший варіант, якщо це можливо, незалежно від нового. Синтаксис є стандартним і це знають усі. Він також сумісний із зворотним ходом.


5

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

Але: Якщо ви хочете використовувати PHP в якості мови шаблонів у файлах перегляду (V MVC), ви можете використовувати цей альтернативний синтаксис для розрізнення коду php, написаного для реалізації бізнес-логіки (частини контролера та моделі MVC) та gui- логіка. Звичайно, це не обов'язково, і ви можете використовувати будь-який синтаксис, який вам подобається.

ZF використовує такий підхід.


5

Немає технічної різниці між двома синтаксисами. Альтернативний синтаксис не новий; його підтримували принаймні ще до PHP 4, а можливо, і раніше.

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

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


3

Зрештою, ви просто не хочете шукати наступний рядок, а потім маєте здогадуватися, з чого він почався:

<?php } ?>

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


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

Раніше я використовував фігурні дужки, але зараз дні я вважаю за краще використовувати цей короткий короткий синтаксис через читабельність коду та доступність.


Я використовую його в моїх шаблонах подання.
alex

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-переглядах
Juraj Blahunka,

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 символів. За допомогою дужок потрібно просто ввести два символи, але для синтаксису на основі ключових слів потрібно ввести ціле додаткове ключове слово для кожного циклу та умовного виразу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.