Perbedaan antara if () {} dan if (): endif;

159

Apakah ada perbedaan antara ...

if ($value) {

}

...dan...

if ($value):

endif;

?

alex
sumber
Cara kedua sudah ada sejak PHP4, jika tidak sebelumnya.
Miles
1
Sebagian besar jawaban tidak benar-benar membahas poin utama : yang bekerja lebih baik ketika Anda melihat beberapa kode dan ada banyak perintah penutupan seperti } } } }(yang dapat dilakukan dengan endifjuga) dan Anda ingin tahu di mana mereka terbuka? Jawabannya adalah tidak . Ini pada dasarnya "aturan" pertama dari prinsip-prinsip desain python .
cregox
7
Jelas {}lebih baik dan : endif;merupakan kekejaman yang tidak akan ada jika hidup adil. Dengan editor teks yang baik Anda akan memiliki pintasan keyboard untuk mencocokkan tanda kurung, untuk melompat Anda dari pembukaan ke penutup atau sebaliknya. Tidak ada hal semacam itu yang pernah ada untuk : endif;sintaksis yang mengerikan itu .
developerwjk
3
@developerwjk bagaimana itu tidak pernah ada?
alex

Jawaban:

177

Mereka sama tetapi yang kedua bagus jika Anda memiliki MVC dalam kode Anda dan tidak ingin memiliki banyak gema dalam kode Anda. Misalnya, dalam .phtmlfile saya (Zend Framework) saya akan menulis sesuatu seperti ini:

<?php if($this->value): ?>
Hello
<?php elseif($this->asd): ?>
Your name is: <?= $this->name ?>
<?php else: ?>
You don't have a name.
<?php endif; ?>
Thomaschaaf
sumber
38
@ alex Ini akan bekerja dengan kurung keriting juga, tapi setidaknya secara pribadi saya menemukan cara semacam ini lebih jelas dalam hal-hal seperti ini. Karena mereka, Anda tahu bahwa itu adalah akhir dari suatu if, dan bukan akhir dari satu lingkaran atau semacamnya. Pikirkan Anda memiliki akhir dan akhir atau sesuatu yang serupa juga.
Svish
10
Saya tidak akan menggunakan <? =?> Karena tidak didukung di semua server, terutama yang dibagikan hosting yang tidak memungkinkan Anda untuk mengubah php.ini.
Siqi Lin
2
Poin yang bersangkutan adalah <? Php endif; ?> - Anda bisa tahu persis apa yang diakhiri bahkan dengan banyak baris HTML di antara sebelumnya jika / lain dan pernyataan ini.
Fenton
7
mengapa "yang kedua hebat jika Anda tidak ingin memiliki banyak gema dalam kode Anda"? Saya pikir itu sama untuk sintaksis tradisional {}juga. Tidak diperlukan gema tambahan <?php if(...){ ?> ... <?php }else{ ?> ... <?php } ?>. Apa bedanya dengan <?php if(...): ?> ... <?php else: ?> ... <?php endif ?>?
Sithu
9
Tidak yakin mengapa jawaban ini adalah yang tertinggi, karena ini bukan contoh yang bagus (Anda dapat mencapai hal yang sama persis dengan kurung kurawal).
Reinier Kaper
69

Saya pribadi sangat membenci sintaks alternatif. Satu hal yang menyenangkan tentang kawat gigi adalah bahwa sebagian besar IDE, vim, dll semuanya memiliki penyorotan braket. Dalam editor teks saya, saya bisa mengklik dua kali penyangga dan itu akan menyorot seluruh potongan sehingga saya bisa melihat di mana itu berakhir dan dimulai dengan sangat mudah.

Saya tidak tahu ada satu editor yang bisa menyorot endif, endforeach, dll.

dprevite
sumber
11
Ini seharusnya digunakan dalam templat PHP, di mana awal dan akhir blok dipisahkan oleh potongan bahasa asing. Jika IDE Anda memahami PHP dengan cukup baik untuk menguraikannya, itu juga harus disoroti endifsebagai end-of-block dengan benar. Jika tidak, Anda tidak benar-benar membeli apa pun dengan menggunakan }karena tidak cocok.
Pavel Minaev
2
Sebagian besar gagasan (setidaknya yang telah saya gunakan) hanya menyoroti {}
AntonioCS
11
Netbeans 7.x dengan senang hati menyorot pencocokan endforeach, endif, dll
Jonathan Day
@Bapak. Minaev: Pencocokan brace akan diurai dengan benar mungkin dalam 98% kasus, bahkan ada kode asing di dalamnya. Ini hanya akan gagal ketika ada tanda kurung ezoter "openning tetapi tidak menutup kode" di dalamnya. Ya, itu terjadi, tetapi jarang terjadi. Mengapa Anda berpikir bahwa "akhir-apa pun yang kompleks" pendekatan parser akan melakukan lebih baik secara praktis, daripada solusi sederhana?
PatlaDJ
Saya pikir poin paling penting adalah deskriptif , saat dibutuhkan. Jadi kita dapat dengan mudah menemukan di mana itu terbuka, terlepas dari alat apa yang perlu kita gunakan. Benar khusus untuk PHP, yang dari waktu ke waktu perlu Anda lihat menggunakan editor yang paling sederhana.
cregox
49

Saya pikir ini yang mengatakan semuanya:

sintaks alternatif ini sangat baik untuk meningkatkan keterbacaan (untuk PHP dan HTML!) dalam situasi di mana Anda memiliki campurannya.

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

Saat mencampur HTML dengan PHP, sytnax alternatif lebih mudah dibaca. Dalam dokumen PHP normal, sintaksis tradisional harus digunakan.


sumber
7
+1, Jawaban yang bagus tentang apa tujuannya. Secara pribadi saya pikir itu adalah tambahan yang tidak berguna untuk bahasa yang sudah berantakan.
Draemon
29

Di perusahaan kami, cara yang disukai untuk menangani HTML adalah:

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

Pada akhirnya, itu benar-benar masalah memilih satu dan tetap menggunakannya.

gahooa
sumber
Terima kasih - saya memperbarui jawaban ini. Sedikit berdetak di sekitar semak-semak, tetapi dapat membantu.
gahooa
Siapa yang Anda maksud ketika Anda mengatakan "kami"?
Oddthinking
+1 untuk menghindari pernyataan gema yang berlebihan dan lolos dari tanda kutip. :)
John McCollum
GALAT:<?php if(TRUE){?> test <?php }?> <?php else{ ?> test2 <?php }?>
Yousha Aleayoub
13

Keduanya memang sama, secara fungsional.

Tetapi jika endifterlalu jauh dari koresponden ifsaya pikir itu praktik yang jauh lebih baik untuk memberikan komentar referensi untuk itu. Supaya Anda dapat dengan mudah menemukan di mana itu terbuka. Tidak peduli apa bahasa itu:

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

Itu sebenarnya berlaku untuk "hal penutup" analog! ;)

Juga, secara umum, editor menangani kurung keriting dengan lebih baik, dalam arti mereka dapat mengarahkan Anda ke tempat kurung buka. Tetapi bahkan itu tidak membuat komentar deskriptif kurang valid.

cregox
sumber
1
setuju ini jauh lebih baik - daripada mengetik endif - Anda dapat mengatakan apa yang kondisi benar-benar lakukan.
cartalot
@cartalot mungkin akan lebih baik jika dibangun dalam bahasa tersebut (sebagai argumen penutup bernama-blok opsional), jadi kami dapat memiliki kesalahan untuk menutup blok yang salah di tempat yang salah! :)
cregox
9

Saya pikir itu sangat jelas ketika Anda menggunakan skrip ifs, fors dan foreaches dalam tampilan:

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

sebagai lawan:

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

Ini sangat berguna untuk pernyataan kontrol panjang di mana Anda mungkin tidak dapat melihat deklarasi atas dari penjepit bawah.

Harry Mustoe-Playfair
sumber
7

Saya pikir itu sangat tergantung pada gaya pengkodean pribadi Anda. Jika Anda terbiasa dengan C ++, Javascript, dll., Anda mungkin merasa lebih nyaman menggunakan sintaks {}. Jika Anda terbiasa dengan Visual Basic, Anda mungkin ingin menggunakan if: endif; sintaksis.

Saya tidak yakin seseorang dapat mengatakan bahwa yang satu lebih mudah dibaca daripada yang lain - ini adalah pilihan pribadi. Saya biasanya melakukan sesuatu seperti ini:

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

Apakah itu lebih mudah dibaca daripada:

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

adalah masalah pendapat. Saya bisa melihat mengapa beberapa orang merasa cara ke-2 lebih mudah - tetapi hanya jika Anda belum memprogram dalam Javascript dan C ++ sepanjang hidup Anda. :)

livefree75
sumber
1
Tidak, tanda kurung lebih mudah dibaca (bila tidak menggunakan versi Mesir). Bahkan jika Anda melakukan kurung sehingga berjalan seperti orang Mesir, lebih mudah dibaca daripada sintaks VB karena editor teks modern akan memiliki fungsi pencocokan braket untuk membawa Anda dari membuka ke menutup braket atau sebaliknya. Tidak mungkin mereka bisa memiliki fungsi pencocokan sintaks VB. Anda juga harus mempertimbangkan, dan VB gagal total.
developerwjk
5

Saya akan menggunakan opsi pertama jika memungkinkan, terlepas dari opsi baru. Sintaksnya standar dan semua orang tahu itu. Ini juga kompatibel ke belakang.

Paulo
sumber
5

Keduanya sama.

Tetapi: Jika Anda ingin menggunakan PHP sebagai bahasa templating Anda dalam file tampilan Anda (V MVC) Anda dapat menggunakan sintaks alternatif ini untuk membedakan antara kode php yang ditulis untuk mengimplementasikan logika bisnis (Pengontrol dan Model bagian MVC) dan gui logika. Tentu saja itu tidak wajib dan Anda dapat menggunakan sintaksis apa pun yang Anda suka.

ZF menggunakan pendekatan itu.

Itay Moav -Malimovka
sumber
5

Tidak ada perbedaan teknis antara kedua sintaksis. Sintaks alternatif bukanlah hal baru; itu didukung setidaknya sejauh PHP 4, dan mungkin bahkan lebih awal.

Anda mungkin lebih suka bentuk alternatif karena secara eksplisit menyatakan struktur kontrol mana yang berakhir:, endwhilemisalnya, hanya dapat mengakhiri whileblok, sedangkan jika Anda menemukan penjepit, itu bisa menutup apa saja.

Anda mungkin lebih suka sintaksis tradisional, jika Anda menggunakan editor yang memiliki dukungan khusus untuk kurung kurawal di sintaks mirip C lainnya. Vim, misalnya, mendukung beberapa penekanan tombol untuk menavigasi ke kawat gigi yang cocok dan ke awal dan akhir dari blok yang dibatasi kurawal. Sintaks alternatif akan merusak fitur editor itu.

Rob Kennedy
sumber
3

Pada akhirnya Anda tidak ingin mencari baris berikut dan kemudian harus menebak dari mana ia dimulai:

<?php } ?>

Secara teknis dan fungsional keduanya sama.

Bondt
sumber
1
Editor teks yang baik akan memiliki jalan pintas yang cocok untuk membawa Anda ke tempat dimulainya. Its endif;yang akan sulit untuk menemukan awal untuk, karena mereka tidak akan memiliki fungsi yang sama untuk itu, dan kode VB-gaya tidak sarang dengan baik.
developerwjk
3

Itu semua tergantung, secara pribadi saya lebih suka sintaksis tradisional dengan gema dan banyak lekukan, karena itu jauh lebih mudah dibaca.

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

Saya setuju bahwa sintaks alt lebih bersih dengan klausa akhir yang berbeda, tapi saya benar-benar kesulitan berurusan dengan mereka tanpa bantuan dari penyorotan editor teks, dan saya tidak terbiasa melihat kode "kental" seperti ini:

<?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; ?>
Yi Yang
sumber
2

Saya dulu menggunakan kurung kurawal tetapi sekarang beberapa hari saya lebih suka menggunakan sintaks alternatif tangan pendek ini karena keterbacaan kode dan aksesibilitas.


sumber
Saya menggunakannya dalam template tampilan saya.
alex
2

Secara pribadi saya lebih suka membuatnya dalam dua bagian yang terpisah tetapi dalam PHP yang sama seperti:

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

?>

Tapi mungkin lebih lambat?

Henrik
sumber
1

Saya pikir ini masalah preferensi. Saya pribadi menggunakan:

if($something){
       $execute_something;
}
Sergio Rodriguez
sumber
1
jika Anda membaca keseluruhan utasnya: sintaksis alternatif lebih disukai dan lebih <em> bersih </em> saat menggunakan atau menggunakan bahasa asing dalam tampilan php
Juraj Blahunka
1

Saya dulu menggunakan kurung keriting untuk kondisi "jika ada". Namun, saya menemukan "if (xxx): endif;" lebih semantik jika kodenya terbungkus tebal dan lebih mudah dibaca di editor mana pun.

Tentu saja, banyak editor yang mampu mengenali dan menyorot potongan kode ketika kurung keriting dipilih. Beberapa juga melakukannya dengan baik pada pasangan "if (xxx): endif" (mis., NetBeans)

Secara pribadi, saya akan merekomendasikan "if (xxx): endif", tetapi untuk pemeriksaan kondisi kecil (misalnya, hanya satu baris kode), tidak ada banyak perbedaan.

Aaron Chen
sumber
1

Saya merasa bahwa tidak ada jawaban yang sudah ada sepenuhnya mengidentifikasi jawaban di sini, jadi saya akan mengartikulasikan perspektif saya sendiri. Secara fungsional, kedua metode itu sama. Jika pemrogram terbiasa dengan bahasa lain mengikuti sintaks C, maka mereka kemungkinan akan merasa lebih nyaman dengan kawat gigi, atau jika php adalah bahasa pertama yang mereka pelajari, mereka akan merasa lebih nyaman denganif endif sintaksis, karena sepertinya lebih dekat ke bahasa reguler.

Jika Anda seorang programmer yang benar-benar serius dan perlu menyelesaikan sesuatu dengan cepat, maka saya percaya bahwa sintaks kurung kurawal lebih unggul karena menghemat waktu mengetik

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

dibandingkan dengan

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

Ini khususnya benar dengan loop lain, katakanlah, di foreachmana Anda akhirnya mengetik 10 karakter tambahan. Dengan kawat gigi, Anda hanya perlu mengetikkan dua karakter, tetapi untuk sintaksis berbasis kata kunci Anda harus mengetikkan seluruh kata kunci tambahan untuk setiap loop dan pernyataan kondisional.

Andrew
sumber