Sự khác biệt giữa if () {} và if (): endif;


158

Có sự khác biệt nào giữa ...

if ($value) {

}

... và ...

if ($value):

endif;

?


Cách thứ hai đã có từ PHP4, nếu không sớm hơn.
Miles


1
Hầu hết các câu trả lời không thực sự giải quyết được vấn đề chính : hoạt động tốt hơn khi bạn xem một số mã và có rất nhiều lệnh đóng như } } } }(có thể được thực hiện cùng endif) và bạn muốn biết chúng được mở ở đâu? Câu trả lời là không . Về cơ bản, đó là "quy tắc" đầu tiên của các nguyên tắc thiết kế python .
cregox

7
Rõ ràng {}là tốt hơn và : endif;là một sự tàn bạo sẽ không tồn tại nếu cuộc sống công bằng. Với một trình soạn thảo văn bản tốt, bạn sẽ có một phím tắt cho dấu ngoặc phù hợp, để chuyển bạn từ mở sang đóng hoặc ngược lại. Không có điều đó cũng không bao giờ có thể tồn tại cho : endif;cú pháp gớm ghiếc .
developerwjk

3
@developerwjk làm thế nào mà không bao giờ tồn tại?
alex

Câu trả lời:


176

Chúng giống nhau nhưng cái thứ hai thì tuyệt vời nếu bạn có MVC trong mã của mình và không muốn có nhiều tiếng vang trong mã của mình. Ví dụ: trong .phtmlcác tệp của tôi (Zend Framework) tôi sẽ viết một cái gì đó như thế này:

<?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 Nó cũng sẽ hoạt động với dấu ngoặc nhọn, nhưng ít nhất cá nhân tôi thấy cách này rõ ràng hơn trong những thứ như thế này. Vì họ biết rằng đó là sự kết thúc của một, và không phải là kết thúc của một vòng lặp nào đó hoặc một cái gì đó khác. Hãy nghĩ rằng bạn có endfor và end hoặc một cái gì đó tương tự quá.
Svish

10
Tôi sẽ không sử dụng <? =?> Vì nó không được hỗ trợ trên tất cả các máy chủ, đặc biệt là các máy chủ lưu trữ được chia sẻ không cho phép bạn thay đổi php.ini.
Siqi Lin

2
Điểm thích hợp là <? Php endif; ?> - bạn có thể cho biết chính xác điều gì sẽ kết thúc ngay cả với nhiều dòng HTML nằm giữa if / other và câu lệnh này.
Fenton

7
tại sao "cái thứ hai là tuyệt vời nếu bạn không muốn có nhiều tiếng vang trong mã của mình"? Tôi nghĩ nó cũng giống với cú pháp truyền thống {}. Không có tiếng vang thêm là cần thiết <?php if(...){ ?> ... <?php }else{ ?> ... <?php } ?>. Sự khác biệt với là <?php if(...): ?> ... <?php else: ?> ... <?php endif ?>gì?
Sithu

9
Không chắc chắn tại sao câu trả lời này là cao nhất, vì nó không phải là một ví dụ tuyệt vời (bạn có thể đạt được chính xác tương tự với niềng răng xoăn).
Rebier Kaper

69

Cá nhân tôi thực sự ghét cú pháp thay thế. Một điều tốt đẹp về niềng răng là hầu hết các IDE, vim, v.v ... đều có tô sáng khung. Trong trình soạn thảo văn bản của tôi, tôi có thể nhấp đúp vào một dấu ngoặc nhọn và nó sẽ làm nổi bật toàn bộ khối để tôi có thể thấy nơi nó kết thúc và bắt đầu rất dễ dàng.

Tôi không biết về một trình soạn thảo duy nhất có thể làm nổi bật endif, endforeach, v.v.


11
Điều này được cho là được sử dụng trong các mẫu PHP, trong đó phần đầu và phần cuối của khối được phân tách bằng một đoạn ngoại ngữ. Nếu IDE của bạn hiểu PHP đủ tốt để phân tích điều đó, thì nó cũng nên làm nổi bật endiflà kết thúc đúng cách. Nếu không, bạn thực sự không mua bất cứ thứ gì bằng cách sử dụng }vì dù sao nó cũng không phù hợp.
Pavel Minaev

2
Hầu hết các ide (ít nhất là những cái tôi đã sử dụng) chỉ nêu bật {}
AntonioCS

11
Netbeans 7.x vui vẻ làm nổi bật kết hợp endforeach, endif, v.v.
Ngày Jonathan

@Ông. Minaev: Công cụ đối sánh niềng răng sẽ phân tích chính xác có thể trong 98% trường hợp, thậm chí có mã nước ngoài bên trong nó. Nó sẽ chỉ thất bại khi có một dấu ngoặc ezoteric "mở nhưng không đóng mã" bên trong nó. Vâng, nó xảy ra, nhưng nó hiếm khi xảy ra. Tại sao bạn nghĩ rằng một "kết thúc-bất cứ điều gì" phức tạp phương pháp phân tích cú pháp sẽ làm tốt hơn thực tế, hơn là giải pháp đơn giản?
PatlaDJ

Tôi nghĩ rằng điểm quan trọng nhất là được mô tả , khi cần thiết. Vì vậy, chúng ta có thể dễ dàng tìm thấy nơi nó được mở, bất kể chúng ta có thể cần sử dụng công cụ nào. Đặc biệt đúng với PHP, đôi khi bạn cần xem bằng cách sử dụng các trình soạn thảo đơn giản nhất.
cregox

49

Tôi nghĩ điều này nói lên tất cả:

cú pháp thay thế này là tuyệt vời để cải thiện mức độ dễ đọc (cho cả PHP và HTML!) trong các tình huống mà bạn có sự kết hợp của chúng.

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

Khi trộn HTML một PHP, sytnax thay thế dễ đọc hơn nhiều. Trong các tài liệu PHP bình thường, cú pháp truyền thống nên được sử dụng.


7
+1, Câu trả lời hay về mục đích của nó là gì. Cá nhân tôi nghĩ rằng đó là một bổ sung vô nghĩa cho một ngôn ngữ đã lộn xộn.
Draemon

29

Tại công ty chúng tôi, cách ưa thích để xử lý HTML là:

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

Cuối cùng, nó thực sự là một vấn đề của việc chọn một và gắn bó với nó.


Cảm ơn - Tôi đã cập nhật câu trả lời này. Nó đập xung quanh bụi cây một chút, nhưng có thể giúp đỡ.
gahooa

Ý bạn là ai khi bạn nói "của chúng tôi"?
Oddthinking

+1 để tránh báo cáo tiếng vang quá mức và thoát dấu ngoặc kép. :)
John McCollum

<?php if(TRUE){?> test <?php }?> <?php else{ ?> test2 <?php }?>
LRI

13

Họ thực sự là cả hai giống nhau, chức năng.

Nhưng nếu điều đó endifđang đi quá xa so với phóng viên, iftôi nghĩ sẽ tốt hơn nhiều nếu đưa ra một nhận xét tham khảo cho nó. Chỉ để bạn có thể dễ dàng tìm thấy nơi nó đã mở. Bất kể đó là ngôn ngữ nào:

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

Điều đó thực sự áp dụng cho bất kỳ "điều đóng cửa" tương tự! ;)

Ngoài ra, nói chung, các biên tập viên xử lý tốt hơn với dấu ngoặc nhọn, theo nghĩa họ có thể chỉ cho bạn đến nơi nó được mở. Nhưng ngay cả điều đó không làm cho các bình luận mô tả trở nên ít hợp lệ hơn.


1
đồng ý điều này tốt hơn nhiều - thay vì gõ endif - bạn có thể nói điều gì nếu điều kiện thực sự đang làm.
cartalot

@cartalot có lẽ sẽ rất hay khi được xây dựng bằng ngôn ngữ (như là một đối số khối có tên đóng tùy chọn), vì vậy chúng tôi có thể có lỗi khi đóng các khối sai ở những vị trí sai! :)
cregox 30/03/2017


9

Tôi nghĩ rằng nó đặc biệt rõ ràng hơn khi bạn sử dụng kết hợp ifs, fors và foreaches trong các tập lệnh xem:

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

như trái ngược với:

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

Điều này đặc biệt hữu ích cho các câu lệnh điều khiển dài trong đó bạn có thể không nhìn thấy khai báo trên cùng từ dấu ngoặc dưới.


7

Tôi nghĩ rằng nó thực sự phụ thuộc vào phong cách mã hóa cá nhân của bạn. Nếu bạn đã quen với C ++, Javascript, v.v., bạn có thể cảm thấy thoải mái hơn khi sử dụng cú pháp {}. Nếu bạn đã quen với Visual Basic, bạn có thể muốn sử dụng if: endif; cú pháp.

Tôi không chắc chắn người ta có thể nói một cách dứt khoát rằng người này dễ đọc hơn người kia - đó là sở thích cá nhân. Tôi thường làm một cái gì đó như thế này:

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

Cho dù đó là dễ đọc hơn:

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

là một vấn đề của ý kiến. Tôi có thể thấy lý do tại sao một số người sẽ cảm thấy cách thứ 2 dễ dàng hơn - nhưng chỉ khi bạn chưa lập trình trong Javascript và C ++ suốt đời. :)


1
Không, dấu ngoặc dễ đọc hơn (khi không sử dụng phiên bản Ai Cập). Ngay cả khi bạn đang thực hiện các dấu ngoặc sao cho chúng đi giống như tiếng Ai Cập, thì nó vẫn dễ đọc hơn cú pháp VB vì các trình soạn thảo văn bản hiện đại sẽ có chức năng khớp khung để đưa bạn từ mở sang đóng khung hoặc ngược lại. Không có cách nào họ có thể có chức năng khớp cú pháp VB. Ngoài ra, bạn có lồng nhau để xem xét, và VB thất bại thảm hại về điều đó.
developerwjk

5

Tôi sẽ sử dụng tùy chọn đầu tiên nếu có thể, bất kể tùy chọn mới. Cú pháp là tiêu chuẩn và mọi người đều biết nó. Nó cũng tương thích ngược.


5

Cả hai đều giống nhau.

Nhưng: Nếu bạn muốn sử dụng PHP làm ngôn ngữ tạo khuôn mẫu trong các tệp xem của bạn (V của MVC), bạn có thể sử dụng cú pháp thay thế này để phân biệt giữa mã php được viết để triển khai logic nghiệp vụ (Bộ phận điều khiển và Mô hình của MVC) và gui- Hợp lý. Tất nhiên nó không bắt buộc và bạn có thể sử dụng những gì bạn thích cú pháp.

ZF sử dụng phương pháp đó.


5

Không có sự khác biệt kỹ thuật giữa hai cú pháp. Cú pháp thay thế không phải là mới; nó đã được hỗ trợ ít nhất là từ PHP 4 và thậm chí sớm hơn.

Bạn có thể thích hình thức thay thế bởi vì nó tuyên bố rõ ràng cấu trúc điều khiển nào đang kết thúc: endwhileví dụ: chỉ có thể chấm dứtwhile khối, trong khi nếu bạn gặp phải một dấu ngoặc, nó có thể đóng bất cứ thứ gì.

Tuy nhiên, bạn có thể thích cú pháp truyền thống hơn nếu bạn sử dụng trình soạn thảo có hỗ trợ đặc biệt cho dấu ngoặc trong các cú pháp giống như C khác. Vim, ví dụ, hỗ trợ một số tổ hợp phím để điều hướng phù hợp với niềng răng và bắt đầu và kết thúc của các khối được phân định bằng dấu ngoặc. Cú pháp thay thế sẽ phá vỡ tính năng soạn thảo đó.


3

Cuối cùng, bạn không muốn tìm kiếm dòng sau và sau đó phải đoán nó bắt đầu từ đâu:

<?php } ?>

Về mặt kỹ thuật và chức năng chúng giống nhau.


1
Một trình soạn thảo văn bản tốt sẽ có một phím tắt khớp với khung để đưa bạn đến nơi nó bắt đầu. Nó endif;sẽ được khó khăn để tìm thấy những khởi đầu cho, bởi vì họ sẽ không có một chức năng tương tự cho rằng, và mã VB-phong cách không làm tổ tốt.
developerwjk

3

Tất cả phụ thuộc, cá nhân tôi thích cú pháp truyền thống với tiếng vang và nhiều vết lõm, vì nó dễ đọc hơn nhiều.

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

Tôi đồng ý cú pháp alt sạch hơn với các mệnh đề kết thúc khác nhau, nhưng tôi thực sự gặp khó khăn khi xử lý chúng mà không có sự trợ giúp từ làm nổi bật trình soạn thảo văn bản và tôi không quen nhìn thấy mã "cô đọng" như thế này:

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

Tôi đã từng sử dụng các dấu ngoặc nhọn nhưng bây giờ tôi thích sử dụng cú pháp thay thế ngắn tay này vì khả năng đọc mã và khả năng truy cập.


Tôi sử dụng nó trong các mẫu xem của tôi.
alex

2

Cá nhân tôi thích làm nó trong hai phần riêng biệt nhưng trong cùng một PHP như:

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

?>

Nhưng có lẽ nó chậm hơn?


1

Tôi nghĩ đó là vấn đề ưu tiên. Cá nhân tôi sử dụng:

if($something){
       $execute_something;
}

1
nếu bạn đọc toàn bộ chủ đề: cú pháp thay thế được ưu tiên và nhiều <em> dọn dẹp </ em> khi tạo khuôn mẫu hoặc sử dụng ngoại ngữ trong chế độ xem php
Juraj Blahunka

1

Tôi đã từng sử dụng dấu ngoặc nhọn cho các điều kiện "nếu, khác". Tuy nhiên, tôi tìm thấy "if (xxx): endif;" là ngữ nghĩa hơn nếu mã được gói rất nhiều và dễ đọc hơn trong bất kỳ trình soạn thảo nào.

Tất nhiên, rất nhiều trình soạn thảo có khả năng nhận biết và làm nổi bật các đoạn mã khi dấu ngoặc nhọn được chọn. Một số cũng làm tốt trên cặp "if (xxx): endif" (ví dụ: NetBeans)

Cá nhân, tôi muốn giới thiệu "if (xxx): endif", nhưng đối với kiểm tra điều kiện nhỏ (ví dụ: chỉ một dòng mã), không có nhiều khác biệt.


1

Tôi cảm thấy rằng không có câu trả lời nào có sẵn hoàn toàn xác định câu trả lời ở đây, vì vậy tôi sẽ nói rõ quan điểm của riêng mình. Về mặt chức năng, hai phương pháp là như nhau. Nếu lập trình viên quen thuộc với các ngôn ngữ khác theo cú pháp C, thì họ có thể sẽ cảm thấy thoải mái hơn với niềng răng, hoặc nếu không thì php là ngôn ngữ đầu tiên họ đang học, họ sẽ cảm thấy thoải mái hơn vớiif endif cú pháp, vì nó có vẻ gần hơn sang ngôn ngữ thông thường.

Nếu bạn là một lập trình viên thực sự nghiêm túc và cần hoàn thành công việc nhanh chóng, thì tôi tin rằng cú pháp cú pháp xoăn là tốt hơn vì nó giúp tiết kiệm thời gian gõ

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

so với

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

Điều này đặc biệt đúng với các vòng lặp khác, giả sử, foreachnơi bạn sẽ gõ thêm 10 ký tự. Với dấu ngoặc nhọn, bạn chỉ cần nhập hai ký tự, nhưng đối với cú pháp dựa trên từ khóa, bạn phải nhập toàn bộ từ khóa bổ sung cho mỗi vòng lặp và câu lệnh điều kiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.