2010-12-28 38 views
14

Làm cách nào để thoát khỏi khối if nếu đáp ứng một số điều kiện nhất định?PHP - thoát khỏi khối IF

tôi đã cố gắng sử dụng break nhưng nó không hoạt động:

if($bla): 
    $bla = get_bla(); 
    if(empty($bla)) break; 
    do($bla); 
endif; 

nó nói: Fatal error: Không thể phá vỡ/tiếp tục 1 cấp ...

+2

kiểm tra http://stackoverflow.com/questions/7468836/any-way-to-break-if-statement-in-php để biết thêm ý kiến ​​(: – AgelessEssence

Trả lời

9

Tại sao không chỉ xoay vòng.

if($bla): 
    $bla = get_bla(); 
    if(!empty($bla)) { 
    do($bla); 
    } 
endif; 

Bằng cách đó nó sẽ chỉ chạy mã của bạn nếu $ bla là không có sản phẩm nào .. Đó là kinda điểm với if-báo cáo

+15

Câu trả lời của bạn giải quyết được vấn đề nhưng không ' t trả lời câu hỏi "Làm thế nào tôi có thể thoát khỏi một khối nếu", nó có giá trị cần lưu ý nếu nó có thể. – rahmanisback

+1

@rahmanisback Như bạn nói, nó giải quyết vấn đề vì vậy tôi không thực sự thấy những gì sai với câu trả lời của tôi . Nếu bạn chỉ cần nhìn xuống một câu trả lời, bạn sẽ thấy câu hỏi được trả lời. Khi tôi đăng câu trả lời của tôi đã có một số bài viết trả lời điều này, vì vậy những gì tôi đã làm là cung cấp một giải pháp thực tế. Bạn không thể phá vỡ một tuyên bố nếu và nếu bạn đã bao giờ cần phải làm như vậy bạn đang sử dụng nó sai. – Sondre

+0

Nó đã giải quyết được vấn đề của tôi! Tôi đã làm điều tương tự, cố gắng thoát ra khi tôi có thể sắp xếp lại. Tôi thấy công đức thực sự trả lời câu hỏi, nhưng nếu câu hỏi đang sử dụng một phương pháp không đúng hoặc không thực tế, cần lưu ý. Cảm ơn! –

12

Bạn không thể phá vỡ nếu phát biểu, chỉ vòng lặp như cho hoặc trong khi.

Nếu điều này nếu có trong một hàm, hãy sử dụng 'trả lại'.

2

Bạn không thể.

Bạn có thể đặt toàn bộ nội dung vào một chức năng mà từ đó bạn có thể return.

Nếu không, bạn sẽ phải thay đổi logic và bao gồm logic khác nếu chặn.

if($bla): 
    $bla = get_bla(); 
    if(!empty($bla)): 
    do($bla); 
    endif; 
endif; 
37

Trong PHP 5.3, bạn có thể sử dụng goto

if($bla): 
    $bla = get_bla(); 
    if(empty($bla)) goto end; 
    do($bla); 
endif; 
end: 

Nhưng cá nhân tôi nghĩ rằng đó là một giải pháp xấu xí.

+6

Tại sao xấu xí? Sẽ hữu ích trong một số trường hợp nhất định. Bỏ phiếu lên! – rahmanisback

+23

GOTO đã bị "cấm" trong chương trình tốt kể từ khi đá – max4ever

+0

Tôi có thể hỏi tại sao những người đứng sau PHP đã giới thiệu nó vào năm 2009? Họ có thể chọn không giới thiệu nó. Tôi đồng ý rằng nó giống như DOS với tôi (không phải trong cách tốt), nhưng nó có thể có ích cho chắc chắn. – Thomas

3

tôi không thể tin rằng không ai có gửi giải pháp này chưa (viết nó trong PHP phong cách của tôi):

if($bla){do{ 
    $bla = get_bla(); 
    if(empty($bla)) break; 
    do($bla); 
}while(false);} 

phức tạp vẫn còn O (1)

+0

Chà. Nhưng nó vẫn hoàn toàn sai đường ... Chúng tôi có goto theo ý của chúng tôi, chúng tôi thậm chí có thể sử dụng một bao gồm() và trở về từ đó, nhưng chúng tôi không thể bỏ thuốc lá nếu khối ... – Marki

2

Đối với tôi nó sẽ giúp bạn có một dấu hiệu thoát trong trường hợp mã cần phải thoát ra giữa khối nếu bạn không nhớ có một nếu chính khách t trong một cái khác.

$exit = FALSE; 

if(!$exit){ 
    if($data["param1"] == cond1){ 
     //do something and continue 
    } 
    else{ 
     //do something 
     $exit = TRUE; 
    } 
} 

if(!$exit){ 
    if($data["param2"] == cond2){ 
     //do something and continue 
    } 
    else{ 
     //do something 
     $exit = TRUE; 
    } 
} 

{...} 

Nếu bạn tiếp tục đặt câu lệnh có điều kiện xung quanh mỗi khối, nó sẽ không thực hiện bất kỳ khối nào khác sau khi bạn đặt $ exit thành true. Bạn có thể đặt tên biến $ tiếp tục và hoàn nguyên vai trò của nó nếu điều đó có ý nghĩa hơn đối với bạn.

nó hoạt động dễ dàng hơn nếu bạn không có báo cáo khác.

$exit = FALSE; 

if($bla): 
    $bla = get_bla(); 
    if(empty($bla)) $exit = TRUE; 
    if(!$exit)do($bla); 
endif; 
0

Nói đúng ra, chúng tôi không thể rời khỏi if -trở sớm, nhưng đôi khi thực sự cần thiết. break chỉ có thể được sử dụng trong vòng lặp và switch-khóa. Nhưng chúng ta có thể đặt if trong một vòng lặp. Vì vậy, câu trả lời của Marcos Fernandez Ramos có lẽ là thích hợp nhất. Đây chỉ là một biến thể đẹp hơn một chút.

do if() 
{ 
    ... 
    if() break; 
    ... 
} while (false); 
0

Hãy thử điều này

do { 

    if($bla) { 
     $bla = get_bla(); 

     if (empty($bla)) { 
      break; 
     } 

     do($bla); 
    } 

    /* You can do more comparisions here */ 

} while (0); 
0

Nếu bạn thực sự muốn có một tuyên bố mà từ đó bạn có thể break, bạn có thể sử dụng một tuyên bố while:

while ($bla) { 
    $bla = get_bla(); 

    if (!$bla) { 
     break; 
    } 

    do($bla); 

    // Maybe some more code... 

    // Do not forget to break out of the while loop! 
    break; 
} 

Đây là một cách tốt để tránh nhiều Các câu lệnh lồng nhau if (có thể tránh được trong nhiều trường hợp), nhưng hãy cẩn thận với break vòng lặp.

0

nếu tình trạng của bạn là một thử nghiệm chống lại một biến duy nhất, sau đó câu lệnh switch là một giải pháp tốt hơn nhiều và bạn có thể dễ dàng thoát ra khỏi:

switch ($var_to_check) { // equivalent to if ($var_to_check==$value_against) 
    case $value_against: 
     ... 
     if ($something_wrong) { break; } // early exit from if 
     ... 
     break; // regular break 
    default: // equivalent to else 
     ... 
} // end of switch (or if) 
... // after the tests 

Nó chỉ hoạt động để kiểm tra thử nghiệm duy nhất. Có lợi thế của việc xử lý một loạt các ifs khác.