İf () {} ve if () arasındaki fark: endif;


159

Arasında herhangi bir fark var mı ...

if ($value) {

}

...ve...

if ($value):

endif;

?


İkinci yol, daha önce olmasa da PHP4'ten beri oradaydı.
Miles


1
Çoğu cevap ana noktaya değinmiyor : bazı kodlara baktığınızda daha iyi çalışıyor ve } } } }(aynı zamanda da yapılabilir endif) gibi çok sayıda kapanış komutu var ve bunların nerede açık olduğunu bilmek mi istiyorsunuz? Cevap da değil . Temelde python tasarım ilkelerinin ilk "kuralı" dır .
cregox

7
Açıkçası {}daha iyidir ve : endif;hayat adil olsaydı var olmayacak bir zulümdür. İyi bir metin editörü ile, parantezleri eşleştirmek için sizi açılıştan kapanışa veya tam tersine atlamak için bir klavye kısayoluna sahip olacaksınız. İğrenç : endif;sözdizimi için böyle bir şey var olamazdı .
developerwjk

3
@developerwjk bu nasıl asla var olamazdı?
alex

Yanıtlar:


177

Bunlar aynıdır ancak ikincisi, kodunuzda MVC varsa ve kodunuzda çok fazla yankı istemiyorsanız harika. Örneğin, .phtmldosyalarımda (Zend Framework) şöyle bir şey yazacağım:

<?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 Kıvırcık parantezlerle de çalışacaktır, ancak en azından kişisel olarak böyle şeylerde bu şekilde daha net buluyorum. Çünkü biliyorsunuz bunun bir if'in sonu olduğunu biliyorsunuz, bir çeşit döngünün sonu değil, başka bir şey. Endfor ve endwhile veya benzeri bir şey olduğunu düşünün.
Svish

10
Tüm sunucularda, özellikle php.ini değiştirmenize izin vermeyen paylaşılan barındırmalarda desteklenmediğinden, <? =?>
Siqi Lin

2
İlgili nokta <? Php endif; ?> - bir önceki if / else ve bu deyim arasındaki birçok HTML satırıyla neyin sonlandığını tam olarak anlayabilirsiniz.
Fenton

7
neden "kodunuzda çok fazla yankı olmasını istemiyorsanız ikincisi harika"? Geleneksel sözdizimi için de aynı olduğunu düşünüyorum {}. Ekstra ekoya gerek yoktur <?php if(...){ ?> ... <?php }else{ ?> ... <?php } ?>. Aradaki fark nedir <?php if(...): ?> ... <?php else: ?> ... <?php endif ?>?
Sithu

9
Bu cevabın neden en yüksek olduğundan emin değilim, çünkü harika bir örnek değil (aynı şeyi kıvırcık parantezlerle elde edebilirsiniz).
Reinier Kaper

69

Ben şahsen alternatif söz diziminden nefret ediyorum. Diş telleri hakkında güzel bir şey, çoğu IDE, vim, vb. Metin düzenleyicimde bir ayracı çift tıklatabilirim ve tüm parçayı vurgulayacaktır, böylece nerede bittiğini ve kolayca başlayacağını görebiliyorum.

Endif, endforeach, vs.'yi vurgulayabilecek tek bir editör bilmiyorum.


11
Bunun, blok başlangıcı ve bitişinin yabancı dil yığınıyla ayrıldığı PHP şablonlarında kullanılması gerekiyordu. IDE'niz PHP'yi ayrıştırmaya yetecek kadar iyi anlıyorsa, endifblok sonu olarak da vurgulanmalıdır . Değilse, }zaten eşleşmeyeceği için kullanarak hiçbir şey satın almazsınız.
Pavel Minaev

2
Çoğu ide (en azından kullandıklarım) sadece {}
AntonioCS

11
Netbeans 7.x mutlulukla eşleşen endforeach, endif, vb vurgulamaktadır
Jonathan Day

@Bay. Minaev: Küme ayracı, muhtemelen vakaların% 98'inde doğru bir şekilde ayrıştırılacak, içinde yabancı kod olsa bile. Sadece içinde ezoterik bir parantez "açılış ama kapanış kodu" olmadığında başarısız olacaktır. Evet, olur, ama nadiren olur. Neden karmaşık olduğunu düşünürsünüz ki "ne olursa olsun;" ayrıştırıcı yaklaşımı pratikte basit çözümden daha iyisini yapar mı?
PatlaDJ

En önemli nokta, gerektiğinde tanımlayıcı olmaktır . Böylece, hangi aleti kullanmamız gerektiğine bakılmaksızın, açık olduğu yeri kolayca bulabiliriz. Özellikle en basit editörleri kullanarak görmeniz gereken PHP için özellikle doğrudur.
cregox

49

Sanırım bu her şeyi söylüyor:

bu alternatif sözdizimi, bunların bir karışımına sahip olduğunuz durumlarda okunabilirliği (hem PHP hem de HTML!) geliştirmek için mükemmeldir.

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

HTML'yi bir PHP karıştırırken alternatif sistem okumak daha kolaydır. Normal PHP belgelerinde geleneksel sözdizimi kullanılmalıdır.


7
+1, amacının ne olduğuna dair güzel bir cevap. Şahsen ben zaten zaten dağınık bir dile anlamsız bir katkı olduğunu düşünüyorum.
Draemon

29

Şirketimizde, HTML'yi kullanmanın tercih edilen yolu:

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

Sonunda, gerçekten birini seçmek ve ona bağlı kalmak meselesi.


Teşekkürler - Bu cevabı güncelledim. Bush'un etrafında biraz atıyor, ancak yardımcı olabilir.
gahooa

"Bizim" derken kimi kastediyorsun?
Garip Düşünce

Aşırı yankı ifadelerinden ve kaçan alıntı işaretlerinden kaçınmak için +1. :)
John McCollum

HATA:<?php if(TRUE){?> test <?php }?> <?php else{ ?> test2 <?php }?>
Yousha Aleayoub

13

Aslında ikisi de aynı şekilde, işlevsel olarak.

Ama endifmuhabirden çok uzaklaşıyorsa, ifona bir referans yorumu vermek çok daha iyi bir uygulama olduğunu düşünüyorum. Sadece nerede açık olduğunu kolayca bulabilirsiniz. Hangi dilde olursa olsun:

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

Bu aslında herhangi bir benzer "kapanış" için geçerlidir! ;)

Ayrıca, genel olarak, editörler kıvırcık parantezlerle daha iyi ilgilenir, yani sizi açık olduğu yere yönlendirebilirler. Ancak bu bile açıklayıcı yorumları daha az geçerli kılmaz.


1
Bunun çok daha iyi olduğunu kabul edin - endif yazmak yerine - if koşulunun gerçekte ne yaptığını söyleyebilirsiniz.
cartalot

@cartalot belki de bu dilde (hatta isteğe bağlı kapanış adlandırılmış blok argümanı olarak) inşa edilmiş olsa bile, yanlış yerlerde yanlış blokları kapatmak için hatalarımız olabilir! :)
cregox


9

Görünüm komut dosyalarında bir ifs, fors ve foreaches karışımı kullandığınızda özellikle daha net olduğunu düşünüyorum :

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

aksine:

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

Bu özellikle alt parantez içindeki üst bildirimi göremeyeceğiniz uzun kontrol ifadeleri için kullanışlıdır.


7

Gerçekten kişisel kodlama stilinize bağlı olduğunu düşünüyorum. C ++, Javascript vs.'ye alışkınsanız, {} sözdizimini kullanarak kendinizi daha rahat hissedebilirsiniz. Visual Basic için alışkınsanız, if: endif; sözdizimi.

Birinin kesinlikle diğerinden daha kolay olduğunu söyleyebileceğinden emin değilim - kişisel tercih. Genellikle böyle bir şey yaparım:

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

Bunun okunması daha kolay olsun:

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

bir görüş meselesidir. Bazılarının neden 2. yolun daha kolay olduğunu hissettiğini anlayabiliyorum - ancak tüm yaşamınız boyunca Javascript ve C ++ 'da programlama yapmadıysanız. :)


1
Hayır, köşeli parantezlerin objektif olarak okunması daha kolaydır (Mısır versiyonunu kullanmadığınızda). Köşeli parantezleri Mısırlı gibi yürüyecek şekilde yapsanız bile, VB sözdiziminden okumak daha kolaydır, çünkü modern metin editörleri sizi açılıştan kapanış parantezine veya başka bir yöne götürecek bir parantez eşleştirme işlevine sahip olacaktır. VB sözdizimi eşleştirme işlevine sahip olmalarının hiçbir yolu yoktur. Ayrıca dikkate almak için yuvalama var ve VB bu konuda sefil başarısız.
developerwjk

5

Yeni seçeneğe bakılmaksızın, mümkünse ilk seçeneği kullanırım. Sözdizimi standarttır ve herkes bunu bilir. Ayrıca geriye dönük olarak uyumludur.


5

Her ikisi de aynı.

Ancak: Görünüm dosyalarınızda (MVC'nin V'si) şablonlama diliniz olarak PHP kullanmak istiyorsanız, iş alternatifini (MVC'nin Denetleyici ve Model bölümleri) uygulamak için yazılan php kodunu ve kılavuzu ayırt etmek için bu alternatif sözdizimini kullanabilirsiniz. mantık. Tabii ki zorunlu değildir ve istediğiniz sözdizimini kullanabilirsiniz.

ZF bu yaklaşımı kullanır.


5

İki sözdizimi arasında teknik bir fark yoktur. Alternatif sözdizimi yeni değil; en azından PHP 4'e kadar ve belki de daha erken bir zamanda desteklendi.

Hangi formun hangi kontrol yapısının sona erdiğini açıkça belirttiği için alternatif formu tercih endwhileedebilirsiniz : örneğin, sadece bir whilebloğu sonlandırabilir , oysa bir ayraçla karşılaşırsanız, herhangi bir şeyi kapatabilir.

Bununla birlikte, diğer C benzeri sözdizimlerinde parantez için özel desteğe sahip bir düzenleyici kullanıyorsanız, geleneksel sözdizimini tercih edebilirsiniz. Örneğin Vim, eşleşen parantezlere ve küme ayracı ile ayrılmış blokların başlangıç ​​ve bitişlerine gitmek için birkaç tuş vuruşunu destekler. Alternatif sözdizimi bu editör özelliğini bozacaktır.


3

Sonunda aşağıdaki satırı aramak ve daha sonra nereden başladığını tahmin etmek istemezsiniz:

<?php } ?>

Teknik ve fonksiyonel olarak aynılar.


1
İyi bir metin düzenleyicide sizi başladığı yere götürmek için bir parantez eşleştirme kısayolu bulunur. Bunun endif;başlangıcı bulmak zor olacak, çünkü bunun için benzer bir işleve sahip olmayacaklar ve VB stili kod iyi yuvalanmıyor.
developerwjk

3

Her şey bağlıdır, kişisel olarak echos ve çok sayıda girinti ile geleneksel sözdizimini tercih ediyorum, çünkü okumak çok daha kolay.

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

Alt sözdiziminin farklı bitiş cümleleriyle daha temiz olduğunu kabul ediyorum, ancak metin editörü vurgulamadan yardım almadan onlarla uğraşmakta gerçekten zorlanıyorum ve sadece şöyle "yoğunlaştırılmış" kodu görmeye alışkın değilim:

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

Kıvırcık parantezleri kullanıyordum ama şimdi bir gün kod okunabilirliği ve erişilebilirliği nedeniyle bu kısa el alternatif sözdizimini kullanmayı tercih ediyorum.


Görünüm şablonlarında kullanıyorum.
alex

2

Şahsen ben iki ayrı bölümlerde yapmayı tercih ama aynı PHP içinde gibi:

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

?>

Ama belki daha yavaştır?



1

"İf, else" koşulları için kıvırcık parantez kullanırdım. Ancak, "if (xxx): endif;" eğer kod aşırı derecede sarılmışsa ve herhangi bir editörde okunması daha semantiktir.

Tabii ki, çok sayıda editör kıvırcık parantez seçildiğinde kod parçalarını tanıyabilir ve vurgulayabilir. Bazıları "if (xxx): endif" çifti üzerinde de başarılıdır (örneğin, NetBeans)

Şahsen, "if (xxx): endif" öneririm, ancak küçük durum kontrolü için (örneğin, sadece bir satır kod), çok fazla fark yoktur.


1

Önceden varolan cevapların hiçbirinin buradaki cevabı tam olarak tanımlayamadığını hissediyorum, bu yüzden kendi bakış açımı ifade edeceğim. İşlevsel olarak, iki yöntem aynıdır. Programcı C sözdizimini izleyen diğer dillere aşina ise, muhtemelen parantezlerle daha rahat hissedeceklerdir, ya da php öğrendikleri ilk dil ise, daha if endifyakın göründüğü için sözdizimiyle daha rahat hissedeceklerdir. normal dile.

Gerçekten ciddi bir programcıysanız ve işleri hızlı bir şekilde yapmanız gerekiyorsa, kıvırcık ayraç sözdiziminin daha üstün olduğuna inanıyorum çünkü zamandan tasarruf sağlıyor

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

nazaran

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

Bu, özellikle foreachfazladan 10 karakter yazacağınız başka döngüler için de geçerlidir . Parantez ile sadece iki karakter yazmanız gerekir, ancak anahtar kelime tabanlı sözdizimi için her döngü ve koşullu ifade için ekstra bir anahtar kelime yazmanız gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.