Różnica między if () {} i if (): endif;


159

Czy są jakieś różnice między ...

if ($value) {

}

...i...

if ($value):

endif;

?


Drugi sposób istnieje od PHP4, jeśli nie wcześniej.
Miles


1
Większość odpowiedzi tak naprawdę nie odnosi się do głównego punktu : co działa lepiej, gdy patrzysz na jakiś kod i jest wiele poleceń zamykających, takich jak } } } }(które można również zrobić endif) i chcesz wiedzieć, gdzie były otwarte? Odpowiedź brzmi: żadne . Jest to w zasadzie pierwsza „zasada” zasad projektowania w Pythonie .
cregox,

7
Oczywiście {}jest lepsze i : endif;jest okrucieństwem, którego nie byłoby, gdyby życie było sprawiedliwe. Z dobrym edytorem tekstu będziesz mieć skrót klawiaturowy do pasujących nawiasów, aby przeskoczyć od początku do końca lub odwrotnie. Żadna taka rzecz nie istnieje i nigdy nie mogłaby istnieć dla tej ohydnej : endif;składni.
developerwjk

3
@developerwjk jak mogłoby to nigdy nie istnieć?
Alex

Odpowiedzi:


177

Są takie same, ale druga jest świetna, jeśli masz MVC w swoim kodzie i nie chcesz mieć wielu ech w swoim kodzie. Na przykład w moich .phtmlplikach (Zend Framework) napiszę coś takiego:

<?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 Będzie to działać również z nawiasami klamrowymi, ale przynajmniej osobiście uważam, że ten sposób jest bardziej przejrzysty w takich sprawach. Bo wiecie, że to koniec „jeśli”, a nie koniec jakiejś pętli czy czegoś innego. Myślisz, że masz koniec i koniec lub coś podobnego.
Svish

10
Nie użyłbym <? =?>, Ponieważ nie jest on obsługiwany na wszystkich serwerach, szczególnie tych, które nie pozwalają na zmianę php.ini.
Siqi Lin

2
Istotnym punktem jest <? Php endif; ?> - możesz dokładnie powiedzieć, co się kończy, nawet wieloma liniami kodu HTML pomiędzy poprzednią instrukcją if / else a tą instrukcją.
Fenton

7
dlaczego „druga jest świetna, jeśli nie chcesz mieć wielu ech w swoim kodzie”? Myślę, że to samo dotyczy tradycyjnej składni {}. Nie jest potrzebne żadne dodatkowe echo <?php if(...){ ?> ... <?php }else{ ?> ... <?php } ?>. Jaka jest różnica <?php if(...): ?> ... <?php else: ?> ... <?php endif ?>?
Sithu,

9
Nie jestem pewien, dlaczego ta odpowiedź jest najwyższa, ponieważ nie jest to świetny przykład (dokładnie to samo można osiągnąć z nawiasami klamrowymi).
Reinier Kaper

69

Osobiście naprawdę nienawidzę alternatywnej składni. Jedną z fajnych rzeczy w nawiasach klamrowych jest to, że większość IDE, vimów itp. Ma podświetlanie nawiasów. W moim edytorze tekstu mogę dwukrotnie kliknąć nawias klamrowy, a podświetli on cały fragment, dzięki czemu mogę bardzo łatwo zobaczyć, gdzie się kończy i zaczyna.

Nie znam ani jednego edytora, który potrafiłby wyróżnić endif, endforeach itp.


11
Ma to być używane w szablonach PHP, w których początek i koniec bloku są oddzielone kawałkiem języka obcego. Jeśli twoje IDE rozumie PHP na tyle dobrze, aby go przeanalizować, powinno również endifpoprawnie wyróżnić się jako koniec bloku. Jeśli tak nie jest, tak naprawdę nie kupujesz niczego za pomocą, }ponieważ i tak nie będzie pasować.
Pavel Minaev

2
Większość ide (przynajmniej tych, których użyłem) wyróżnia tylko {}
AntonioCS,

11
Netbeans 7.x szczęśliwie podkreśla pasujące endforeach, endif itp.
Jonathan Day

@Pan. Minaev: Dopasowanie nawiasów klamrowych będzie poprawnie analizować prawdopodobnie w 98% przypadków, nawet jeśli zawiera obcy kod. Nie powiedzie się tylko wtedy, gdy w środku znajduje się klamra ezoteryczna „otwierająca, ale nie zamykająca”. Tak, zdarza się, ale zdarza się to rzadko. Dlaczego myślisz, że złożone „koniec-cokolwiek”; podejście parsera sprawdzi się praktycznie lepiej niż proste rozwiązanie?
PatlaDJ

Myślę, że najważniejszą kwestią jest opisywanie , gdy jest to potrzebne. Dzięki temu możemy łatwo sprawdzić, gdzie był otwarty, niezależnie od tego, jakiego narzędzia będziemy potrzebować. Szczególnie dotyczy PHP, które od czasu do czasu trzeba zobaczyć przy użyciu najbardziej uproszczonych edytorów.
cregox

49

Myślę, że to mówi wszystko:

ta alternatywna składnia jest doskonała do poprawy czytelności (zarówno dla PHP, jak i HTML!) w sytuacjach, gdy masz ich połączenie.

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

Podczas mieszania HTML i PHP alternatywny sytnax jest znacznie łatwiejszy do odczytania. W normalnych dokumentach PHP powinna być używana tradycyjna składnia.


7
+1, Dobra odpowiedź na temat tego, jaki jest jej cel. Osobiście uważam, że to bezcelowy dodatek do już zagraconego języka.
Draemon

29

W naszej firmie preferowanym sposobem obsługi HTML jest:

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

W końcu to naprawdę kwestia wyboru jednego i trzymania się go.


Dzięki - zaktualizowałem tę odpowiedź. Trochę bije w bawełnę, ale może pomóc.
gahooa,

Kogo masz na myśli, mówiąc „nasz”?
Oddthinking

+1 za unikanie nadmiernych instrukcji echa i znaków cudzysłowu. :)
John McCollum,

BŁĄD:<?php if(TRUE){?> test <?php }?> <?php else{ ?> test2 <?php }?>
Yousha Aleayoub

13

Rzeczywiście, funkcjonalnie są takie same.

Ale jeśli endifjest zbyt daleko od korespondenta if, myślę, że znacznie lepszą praktyką jest podanie do niego komentarza. Abyś mógł łatwo sprawdzić, gdzie był otwarty. Bez względu na język:

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

To faktycznie odnosi się do każdego analogicznego „zamknięcia”! ;)

Ogólnie rzecz biorąc, redaktorzy lepiej radzą sobie z nawiasami klamrowymi, w tym sensie, że mogą wskazać, gdzie był otwarty. Ale nawet to nie sprawia, że ​​opisowe komentarze są mniej ważne.


1
zgadzam się, że jest znacznie lepiej - zamiast wpisywać endif - możesz powiedzieć, co faktycznie robi warunek if.
kartalot

@cartalot być może byłoby nawet fajnie mieć wbudowany w język (jako opcjonalny zamykający argument nazwanego bloku), więc moglibyśmy mieć błędy przy zamykaniu niewłaściwych bloków w niewłaściwych miejscach! :)
cregox


9

Myślę, że jest to szczególnie wyraźne, gdy używasz kombinacji ifs, fors i foreaches w skryptach widoku:

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

w przeciwieństwie do:

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

Jest to szczególnie przydatne w przypadku długich instrukcji sterujących, w których możesz nie być w stanie zobaczyć górnej deklaracji z dolnego nawiasu klamrowego.


7

Myślę, że to naprawdę zależy od Twojego osobistego stylu kodowania. Jeśli jesteś przyzwyczajony do C ++, Javascript itp., Możesz czuć się bardziej komfortowo, używając składni {}. Jeśli jesteś przyzwyczajony do Visual Basic, możesz użyć if: endif; składnia.

Nie jestem pewien, czy można definitywnie powiedzieć, że jedno jest łatwiejsze do odczytania niż drugie - to osobiste preferencje. Zwykle robię coś takiego:

<?php
if ($foo) { ?>
   <p>Foo!</p><?php
} else { ?>
   <p>Bar!</p><?php
}  // if-else ($foo) ?>

Czy jest to łatwiejsze do odczytania niż:

<?php
if ($foo): ?>
   <p>Foo!</p><?php
else: ?>
   <p>Bar!</p><?php
endif; ?>

to kwestia opinii. Rozumiem, dlaczego niektórzy uważają, że druga droga jest łatwiejsza - ale tylko wtedy, gdy przez całe życie nie programowałeś w Javascript i C ++. :)


1
Nie, nawiasy są obiektywnie łatwiejsze do odczytania (jeśli nie używasz wersji egipskiej). Nawet jeśli robisz nawiasy tak, że chodzą jak Egipcjanin, jest to łatwiejsze do odczytania niż składnia VB, ponieważ nowoczesne edytory tekstu będą miały funkcję dopasowywania nawiasów, aby przejść od nawiasu otwierającego do zamykającego lub na odwrót. W żaden sposób nie mogliby mieć funkcji dopasowywania składni VB. Musisz także wziąć pod uwagę zagnieżdżenie, a VB zawodzi na tym żałośnie.
developerwjk

5

Korzystałbym z pierwszej opcji, jeśli to w ogóle możliwe, niezależnie od nowej opcji. Składnia jest standardowa i wszyscy o tym wiedzą. Jest również kompatybilny wstecz.


5

Obie są takie same.

Ale: Jeśli chcesz używać PHP jako języka szablonów w swoich plikach widoku (V z MVC), możesz użyć tej alternatywnej składni do rozróżnienia między kodem php napisanym w celu implementacji logiki biznesowej (części kontrolera i modelu MVC) a przewodnikiem logika. Oczywiście nie jest to obowiązkowe i możesz użyć dowolnej składni.

ZF stosuje to podejście.


5

Nie ma technicznej różnicy między tymi dwiema składniami. Alternatywna składnia nie jest nowa; był obsługiwany co najmniej od PHP 4, a może nawet wcześniej.

Możesz preferować alternatywną formę, ponieważ wyraźnie określa, która struktura kontrolna się kończy: endwhilena przykład może zakończyć tylko whileblok, podczas gdy jeśli napotkasz nawias klamrowy, może to zamknąć wszystko.

Możesz jednak preferować tradycyjną składnię, jeśli używasz edytora, który ma specjalne wsparcie dla nawiasów klamrowych w innych składniach podobnych do języka C. Na przykład Vim obsługuje kilka naciśnięć klawiszy do nawigacji do pasujących nawiasów klamrowych oraz do początku i końca bloków rozdzielanych nawiasami. Alternatywna składnia złamałaby tę funkcję edytora.


3

W końcu po prostu nie chcesz szukać następującego wiersza, a następnie zgadywać, gdzie się zaczął:

<?php } ?>

Technicznie i funkcjonalnie są takie same.


1
Dobry edytor tekstu będzie miał skrót do dopasowywania nawiasów, który przeniesie Cię do miejsca, w którym się zaczął. Jej endif;, że będzie trudno znaleźć początek, ponieważ nie będą one miały podobną funkcję, która i kod VB-Styl nie gniazdo dobrze.
developerwjk

3

Wszystko zależy, osobiście wolę tradycyjną składnię z echami i dużą ilością wcięć, ponieważ jest o wiele łatwiejsza do odczytania.

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

Zgadzam się, że składnia alt jest bardziej przejrzysta dzięki różnym klauzulom końcowym, ale naprawdę ciężko mi sobie z nimi radzić bez pomocy podświetlania w edytorze tekstu i po prostu nie jestem przyzwyczajony do oglądania „skondensowanego” kodu w ten sposób:

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

Kiedyś użyłem nawiasów klamrowych, ale teraz wolę używać tej alternatywnej składni krótkiej ręki ze względu na czytelność kodu i dostępność.


Używam go w moich szablonach widoków.
Alex

2

Osobiście wolę zrobić to w dwóch oddzielnych sekcjach, ale w tym samym PHP, na przykład:

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

?>

Ale może jest wolniejszy?


1

Myślę, że to kwestia preferencji. Osobiście używam:

if($something){
       $execute_something;
}

1
gdybyś przeczytał cały wątek: preferowana jest alternatywna składnia i znacznie <em> czystsza </em> podczas tworzenia szablonów lub używania języka obcego w widokach php
Juraj Blahunka

1

Kiedyś używałem nawiasów klamrowych dla warunków „jeśli, inaczej”. Jednak znalazłem „if (xxx): endif;” jest bardziej semantyczny, jeśli kod jest mocno zawinięty i łatwiejszy do odczytania w jakimkolwiek edytorze.

Oczywiście wielu edytorów jest w stanie rozpoznać i podświetlić fragmenty kodu po wybraniu nawiasów klamrowych. Niektóre radzą sobie również dobrze z parą „if (xxx): endif” (np. NetBeans)

Osobiście polecałbym „if (xxx): endif”, ale w przypadku małego sprawdzenia stanu (np. Tylko jednej linii kodu) nie ma zbyt wielu różnic.


1

Wydaje mi się, że żadna z istniejących wcześniej odpowiedzi w pełni nie identyfikuje odpowiedzi tutaj, więc zamierzam wyartykułować własną perspektywę. Funkcjonalnie obie metody są takie same. Jeśli programista jest zaznajomiony z innymi językami stosującymi składnię C, prawdopodobnie będzie czuł się bardziej komfortowo z nawiasami klamrowymi, albo jeśli php jest pierwszym językiem, którego się uczy, będzie czuł się bardziej komfortowo ze if endifskładnią, ponieważ wydaje się być bliższa do zwykłego języka.

Jeśli jesteś naprawdę poważnym programistą i chcesz szybko załatwić sprawę, to uważam, że składnia nawiasów klamrowych jest lepsza, ponieważ oszczędza czas pisania

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

w porównaniu do

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

Jest to szczególnie prawdziwe w przypadku innych pętli, powiedzmy a, w foreachktórych w końcu wpisujesz dodatkowe 10 znaków. W przypadku nawiasów klamrowych wystarczy wpisać dwa znaki, ale w przypadku składni opartej na słowach kluczowych należy wpisać całe dodatkowe słowo kluczowe dla każdej pętli i instrukcji warunkowej.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.