ความแตกต่างระหว่าง if () {} และ if (): endif;


159

มีความแตกต่างระหว่าง ...

if ($value) {

}

...และ...

if ($value):

endif;

?


วิธีที่สองอยู่ที่นั่นตั้งแต่ PHP4 ถ้าไม่ใช่ก่อนหน้านี้
ไมล์

ดูเพิ่มเติมได้ที่: stackoverflow.com/questions/381259/…
Jacco

1
คำตอบส่วนใหญ่ไม่ได้พูดถึงประเด็นหลักจริง ๆ: วิธีใดที่ทำงานได้ดีกว่าเมื่อคุณดูรหัสและมีคำสั่งปิดเช่น} } } }(ซึ่งสามารถทำได้ด้วยendif) และคุณต้องการทราบว่าเปิดที่ไหน คำตอบคือไม่ มันเป็นพื้นแรก "กฎ" หลักการออกแบบหลาม
cregox

7
เห็นได้ชัดว่า{}ดีกว่าและ: endif;โหดร้ายที่จะไม่มีอยู่หากชีวิตมีความยุติธรรม ด้วยโปรแกรมแก้ไขข้อความที่ดีคุณจะมีแป้นพิมพ์ลัดสำหรับจับคู่วงเล็บเพื่อข้ามคุณจากการเปิดไปยังการปิดหรือในทางกลับกัน ไม่มีสิ่งใดที่ไม่สามารถเกิดขึ้นได้สำหรับ: endif;ไวยากรณ์ที่น่ากลัว
developerwjk

3
@developerwjk วิธีการที่ไม่เคยมีอยู่?
alex

คำตอบ:


177

พวกเขาเหมือนกัน แต่อันที่สองนั้นยอดเยี่ยมถ้าคุณมี MVC ในรหัสของคุณและไม่ต้องการมี echos จำนวนมากในรหัสของคุณ ตัวอย่างเช่นใน.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 และ end ปั้นหรือสิ่งที่คล้ายกันเกินไป
Svish

10
ฉันจะไม่ใช้ <? =?> เพราะเซิร์ฟเวอร์ทั้งหมดนั้นไม่รองรับโดยเฉพาะอย่างยิ่งโฮสติ้งที่ใช้ร่วมกันที่ไม่อนุญาตให้คุณเปลี่ยน php.ini
Siqi Lin

2
จุดที่เกี่ยวข้องคือ <? php endif; ?> - คุณสามารถบอกได้ว่าอะไรที่ลงท้ายด้วย HTML หลายบรรทัดในระหว่าง if / else และข้อความก่อนหน้านี้
เฟนตัน

7
ทำไม "อันที่สองดีมากถ้าคุณไม่ต้องการมี echos จำนวนมากในรหัสของคุณ"? ฉันคิดว่ามันเหมือนกันสำหรับไวยากรณ์ดั้งเดิม{}เช่นกัน <?php if(...){ ?> ... <?php }else{ ?> ... <?php } ?>ไม่มีเสียงสะท้อนพิเศษเป็นสิ่งจำเป็น ความแตกต่าง<?php if(...): ?> ... <?php else: ?> ... <?php endif ?>คืออะไร?
Sithu

9
ไม่แน่ใจว่าทำไมคำตอบนี้ถึงมากที่สุดเพราะมันไม่ใช่ตัวอย่างที่ดี (คุณสามารถทำแบบเดียวกันได้ด้วยวงเล็บปีกกา)
Reinier Kaper

69

โดยส่วนตัวแล้วฉันเกลียดชังไวยากรณ์ทางเลือก สิ่งหนึ่งที่ดีเกี่ยวกับการจัดฟันก็คือ IDEs, vim และอื่น ๆ ส่วนใหญ่จะมีเครื่องหมายวงเล็บ ในเครื่องมือแก้ไขข้อความของฉันฉันสามารถคลิกวงเล็บปีกกาสองครั้งและมันจะเน้นทั้งก้อนเพื่อให้ฉันสามารถดูว่าจุดสิ้นสุดและเริ่มต้นได้ง่ายมาก

ฉันไม่รู้เครื่องมือแก้ไขตัวเดียวที่สามารถเน้น endif, endforeach และอื่น ๆ


11
นี่ควรจะใช้ในเท็มเพลต PHP โดยที่จุดเริ่มต้นและจุดสิ้นสุดของบล็อกถูกคั่นด้วยกลุ่มภาษาต่างประเทศ ถ้า IDE ของคุณเข้าใจ PHP ดีพอที่จะแยกมันก็ควรเน้นendifเป็นจุดสิ้นสุดของบล็อกอย่างถูกต้อง หากไม่เป็นเช่นนั้นคุณจะไม่ซื้ออะไรเลยโดยใช้}เพราะจะไม่ตรงกัน
Pavel Minaev

2
ide ส่วนใหญ่ (อย่างน้อยที่ฉันเคยใช้) เน้นเฉพาะ {}
AntonioCS

11
Netbeans 7.x เน้นการจับคู่ endforeach, endif และอื่น ๆ อย่างมีความสุข
Jonathan Day

@นาย. Minaev: เครื่องมือจับคู่วงเล็บปีกกาจะวิเคราะห์คำอย่างถูกต้องในกรณี 98% แม้ว่าจะมีรหัสต่างประเทศอยู่ภายในก็ตาม มันจะล้มเหลวเมื่อมีวงเล็บ ezoteric "เปิดตัว แต่ไม่ได้ปิดรหัส" ภายใน ใช่มันเกิดขึ้น แต่มันไม่ค่อยเกิดขึ้น ทำไมคุณถึงคิดว่าคอมเพล็กซ์ "จบสิ้นอะไรก็ได้" วิธีการแยกวิเคราะห์จะทำได้ดีกว่าในทางปฏิบัติจริงกว่าวิธีง่ายๆ
PatlaDJ

ผมคิดว่าจุดที่สำคัญที่สุดคือการถูกพรรณนาเมื่อมีความจำเป็น ดังนั้นเราสามารถหาได้ง่ายว่าเปิดที่ไหนโดยไม่คำนึงถึงเครื่องมือที่เราต้องใช้ จริงเป็นพิเศษสำหรับ PHP ซึ่งบางครั้งคุณจำเป็นต้องดูโดยใช้บรรณาธิการที่ง่ายที่สุด
cregox

49

ฉันคิดว่านี่พูดมันทั้งหมด:

ไวยากรณ์ทางเลือกนี้เหมาะสำหรับการปรับปรุงความชัดเจน (ทั้ง PHP และ HTML!) ในสถานการณ์ที่คุณมีการผสมผสานกัน

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

เมื่อผสม HTML กับ PHP sytnax ทางเลือกจะอ่านง่ายขึ้นมาก ในเอกสาร PHP ปกติควรใช้ไวยากรณ์แบบดั้งเดิม


7
+1, คำตอบที่ดีเกี่ยวกับวัตถุประสงค์ของมันคืออะไร โดยส่วนตัวแล้วฉันคิดว่ามันเป็นการเพิ่มเติมที่ไร้ประโยชน์สำหรับภาษาที่ยุ่งเหยิงไปแล้ว
Draemon

29

ที่ บริษัท ของเราวิธีการจัดการ HTML ที่ต้องการคือ:

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

ในท้ายที่สุดมันเป็นเรื่องของการเลือกและติดกับมัน


ขอบคุณ - ฉันได้อัพเดตคำตอบนี้แล้ว มันเต้นรอบ ๆ พุ่มไม้นิดหน่อย แต่อาจช่วยได้
gahooa

คุณหมายถึงใครเมื่อคุณพูดว่า "ของเรา"
Oddthinking

+1 สำหรับหลีกเลี่ยงคำสั่ง echo ที่มากเกินไปและหลีกเลี่ยงเครื่องหมายคำพูด :)
John McCollum

ข้อผิดพลาด:<?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 - คุณสามารถพูดได้ว่าเงื่อนไขคืออะไร
cartalot

@cartalot บางทีมันอาจจะดีที่ได้สร้างขึ้นในภาษา (เป็นอาร์กิวเมนต์ปิดกั้นชื่อบล็อกเสริม) ดังนั้นเราจึงอาจมีข้อผิดพลาดในการปิดบล็อกที่ผิดในสถานที่ที่ไม่ถูกต้อง! :)
cregox


9

ผมคิดว่ามันเป็นที่ชัดเจนโดยเฉพาะอย่างยิ่งเมื่อคุณกำลังใช้การผสมผสานของifs, forและ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; ?>

เป็นเรื่องของความเห็น ฉันเห็นว่าทำไมบางคนถึงรู้สึกว่าวิธีที่ 2 นั้นง่ายกว่า - แต่ถ้าคุณยังไม่ได้เขียนโปรแกรมใน Javascript และ C ++ ตลอดชีวิตของคุณ :)


1
ไม่วงเล็บง่ายต่อการอ่าน (เมื่อไม่ได้ใช้รุ่นอียิปต์) แม้ว่าคุณกำลังทำวงเล็บเช่นที่พวกเขาเดินเหมือนชาวอียิปต์มันอ่านง่ายกว่าไวยากรณ์ VB เพราะโปรแกรมแก้ไขข้อความที่ทันสมัยจะมีฟังก์ชั่นการจับคู่วงเล็บปีกกาที่จะพาคุณจากการเปิดไปยังวงเล็บปิดหรือวิธีอื่น ๆ ไม่มีวิธีที่พวกเขาสามารถมีฟังก์ชั่นการจับคู่ไวยากรณ์ VB นอกจากนี้คุณยังมีการทำรังเพื่อพิจารณาและ VB ล้มเหลวอย่างน่าสังเวช
developerwjk

5

ฉันจะใช้ตัวเลือกแรกถ้าเป็นไปได้โดยไม่คำนึงถึงตัวเลือกใหม่ ไวยากรณ์เป็นมาตรฐานและทุกคนรู้ มันยังเข้ากันได้ย้อนหลัง


5

ทั้งสองเหมือนกัน

แต่: หากคุณต้องการใช้ PHP เป็นภาษาเทมเพลตของคุณในไฟล์มุมมอง (V of MVC) คุณสามารถใช้ไวยากรณ์ทางเลือกนี้เพื่อแยกความแตกต่างระหว่างรหัส PHP ที่เขียนเพื่อใช้งานกับตรรกะทางธุรกิจ (ส่วนควบคุมและรุ่นของ MVC) และ gui- ตรรกะ. แน่นอนว่ามันไม่ได้บังคับและคุณสามารถใช้ไวยากรณ์ที่คุณชอบ

ZF ใช้วิธีการนั้น


5

ไม่มีความแตกต่างทางเทคนิคระหว่างสองไวยากรณ์ ไวยากรณ์ทางเลือกไม่ใช่เรื่องใหม่ มันได้รับการสนับสนุนอย่างน้อยเท่า PHP 4 และอาจเร็วกว่านี้

คุณอาจต้องการรูปแบบทางเลือกเนื่องจากมันระบุอย่างชัดเจนว่าโครงสร้างการควบคุมใดที่กำลังจะสิ้นสุด: endwhileตัวอย่างเช่นสามารถยุติwhileบล็อกได้เท่านั้นในขณะที่ถ้าคุณพบกับรั้งมันอาจจะปิดอะไรก็ได้

คุณอาจชอบไวยากรณ์แบบดั้งเดิม แต่ถ้าคุณใช้โปรแกรมแก้ไขที่มีการสนับสนุนเป็นพิเศษสำหรับการจัดฟันในไวยากรณ์ C-like อื่น ๆ ตัวอย่างเช่นกลุ่มสนับสนุนการกดแป้นหลายครั้งสำหรับการนำทางไปยังเครื่องหมายวงเล็บปีกกาและไปยังจุดเริ่มต้นและจุดสิ้นสุดของบล็อกที่คั่นด้วยวงเล็บปีกกา ไวยากรณ์ทางเลือกจะทำให้คุณสมบัติตัวแก้ไขนั้นเสียหาย


3

ในที่สุดคุณก็ไม่ต้องการที่จะมองหาบรรทัดต่อไปนี้แล้วต้องเดาว่ามันเริ่มที่ไหน:

<?php } ?>

ในทางเทคนิคและในทางปฏิบัติมันเหมือนกัน


1
โปรแกรมแก้ไขข้อความที่ดีจะมีทางลัดวงเล็บปีกกาเพื่อนำคุณไปยังจุดเริ่มต้น มันendif;จะยากที่จะหาจุดเริ่มต้นเพราะพวกเขาจะไม่ได้มีฟังก์ชั่นที่คล้ายกันสำหรับที่และรหัสสไตล์ VB ไม่ดี
developerwjk

3

ทุกอย่างขึ้นอยู่กับตัวเองฉันชอบไวยากรณ์แบบดั้งเดิมที่มี echos และการเยื้องมากมายเนื่องจากอ่านได้ง่ายกว่ามาก

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

ฉันเคยใช้วงเล็บปีกกา แต่ตอนนี้วันฉันต้องการใช้ไวยากรณ์ทางเลือกสั้น ๆ นี้เพราะการอ่านรหัสและการเข้าถึง


ฉันใช้ในเทมเพลตมุมมองของฉัน
อเล็กซ์

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> เมื่อ templating หรือใช้ภาษาต่างประเทศในมุมมอง 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 ตัว ด้วยวงเล็บปีกกาคุณเพียงแค่ต้องพิมพ์อักขระสองตัว แต่สำหรับไวยากรณ์ตามคำหลักคุณต้องพิมพ์คำสำคัญพิเศษทั้งหมดสำหรับทุกคำสั่งวนซ้ำและเงื่อนไข

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.