2010-12-28 17 views
14

Jak wyjść z bloku if, jeśli spełniony jest określony warunek?PHP - wyjście z bloku IF

Próbowałem za pomocą break ale to nie działa:

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

mówi: Fatal error: Nie można przerwać/kontynuować 1 poziom w ...

+2

sprawdź http://stackoverflow.com/questions/7468836/any-way-to-break-if-statement-in-php, aby uzyskać więcej opinii (: – AgelessEssence

Odpowiedz

9

Dlaczego po prostu go nie odwracać.

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

ten sposób to będzie działać tylko jeśli kod $ bla nie jest pusta .. To trochę jeśli chodzi o-sprawozdaniach

+15

Twoja odpowiedź rozwiązuje problem, ale nie działa" t odpowiedzieć na pytanie "Jak mogę wyjść z bloku if", warto zauważyć, czy jest to możliwe. – rahmanisback

+1

@rahmanisback Jak mówisz, rozwiązuje problem, więc nie widzę, co jest nie tak z moją odpowiedzią . Jeśli spojrzysz tylko na jedną odpowiedź, zobaczysz, że odpowiedź na to pytanie. Kiedy wysłałem odpowiedź, było już kilka odpowiedzi na to pytanie, więc to, co zrobiłem, stanowiło rzeczywiste rozwiązanie. Nie możesz złamać instrukcji if i jeśli kiedykolwiek będziesz tego potrzebować, użyjesz go nieprawidłowo. – Sondre

+0

To rozwiązało mój problem! Robiłem to samo, próbując wyjść, kiedy mogłem się zmienić. Dostrzegam zasługę w odpowiadaniu na to pytanie, ale jeśli pytanie to jest niewłaściwe lub niepraktyczne, należy to zauważyć. Dzięki! –

12

nie można złamać, jeżeli sprawozdania, tylko pętle podobne do lub dla.

Jeśli jest to funkcja, użyj "return".

2

Nie możesz.

Możesz umieścić całą rzecz w funkcji, z której możesz return.

W przeciwnym razie konieczna będzie zmiana logiki i dodanie innego bloku if.

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

W PHP 5.3 można użyć goto

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

Ale osobiście myślę, że to brzydkie rozwiązanie.

+6

Dlaczego brzydko? Byłoby to przydatne w pewnych sytuacjach na pewno. Głosujcie! – rahmanisback

+23

GOTO zostało "zakazane" w dobrym programowaniu od czasów kamienia łupanego – max4ever

+0

Czy mogę zapytać, dlaczego ludzie stojący za PHP wprowadzili go w 2009 r. Mogli zdecydować, że w ogóle go nie wprowadzą.Zgadzam się, że jest bardzo podobny do DOS-a dla mnie (nie w dobrym tego słowa znaczeniu), ale może się to przydać na pewno. – Thomas

3

Nie mogę uwierzyć nikt nie ma zakładać jeszcze tego rozwiązania (pisanie go w mój styl PHP):

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

Złożoność nadal O (1)

+0

Wow. Ale wciąż jest całkowicie zboczony ... Mamy do dyspozycji, możemy nawet użyć include() i wrócić stamtąd, ale nie możemy po prostu wyjść z bloku if ... – Marki

2

dla mnie to pomaga na znacznik ewakuacji w przypadku kod musi wyjść między blokami, jeśli nie przeszkadza mającą czy wyciąg z konta bankowego w innym.

Jeśli będziesz umieszczać instrukcje warunkowe wokół każdego bloku, nie wykona żadnych innych bloków po ustawieniu $ exit na true. Możesz nazwać zmienną $ continue i przywrócić jej role, jeśli ma to dla ciebie większy sens.

działa łatwiej, jeśli nie masz innych instrukcji.

$exit = FALSE; 

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

Ściśle mówiąc, nie możemy zostawić if -blok przedwcześnie, ale czasami jest to naprawdę potrzebne. break może być używany tylko wewnątrz pętli i switch -block. Ale możemy umieścić w pętli if. Odpowiedź Marcosa Fernandeza Ramosa jest prawdopodobnie najbardziej odpowiednia. Oto nieco przyjemniejszy wariant.

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

Spróbuj

do { 

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

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

     do($bla); 
    } 

    /* You can do more comparisions here */ 

} while (0); 
0

Jeśli naprawdę chcesz oświadczenie, z którego można break, można użyć while oświadczenie:

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

Jest to dobry sposób na uniknięcie wielu zagnieżdżone instrukcje if (których w wielu przypadkach można uniknąć), ale należy uważać na pętlę break.

0

jeśli warunek jest test na pojedynczej zmiennej, wtedy instrukcja switch jest dużo lepszym rozwiązaniem i można łatwo wyrwać:

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 

Działa tylko dla pojedynczych kontroli testowych. Ma tę zaletę, że obsługuje wiele innych ifs.