2010-12-28 16 views
14

Come posso uscire da un blocco if se viene soddisfatta una determinata condizione?PHP - uscita dal blocco IF

Ho provato ad utilizzare break ma non funziona:

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

dice: Fatal error: non può rompere/continuare 1 livello in ...

+2

controllare http://stackoverflow.com/questions/7468836/new-way-to-break-if-statement-in-php per ulteriori opinioni (: – AgelessEssence

risposta

9

Perché non girarlo.

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

In questo modo sarà eseguito solo se il codice $ bla non è vuota .. Questo è un pò il punto con se-dichiarazioni

+15

La tua risposta risolve il problema ma non lo fa t rispondi alla domanda "Come posso uscire da un blocco if", vale la pena di notare se è mai possibile. – rahmanisback

+1

@rahmanisback Come dici tu, risolve il problema quindi non vedo davvero cosa c'è che non va nella mia risposta . Se guardi solo una risposta, vedrai che la domanda ha una risposta. Quando ho postato la mia risposta c'erano già diversi post che rispondevano a questo, quindi quello che ho fatto è stato fornire una soluzione reale. Non puoi rompere una dichiarazione if e se hai mai bisogno di farlo, la stai usando male. – Sondre

+0

Ha risolto il mio problema! Stavo facendo la stessa cosa, cercando di uscire quando potevo riorganizzare. Vedo il merito nel rispondere effettivamente alla domanda, ma se la domanda sta usando un metodo improprio o non pratico, dovrebbe essere notato. Grazie! –

12

Non si può rompere se le dichiarazioni, solo loop come per o mentre

Se questo è in una funzione, utilizzare 'return'.

2

Non è possibile.

È possibile inserire l'intero oggetto in una funzione da cui è possibile eseguire return.

In caso contrario, sarà necessario modificare la logica e includere un altro se blocco.

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

In PHP 5.3 è possibile utilizzare goto

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

Ma personalmente credo che sia una soluzione brutta.

+6

Perché brutto? Sarebbe utile in determinate situazioni di sicuro. Vota su! – rahmanisback

+23

GOTO è stato "vietato" in buona programmazione sin dall'età della pietra – max4ever

+0

Posso chiedere perché le persone dietro PHP l'hanno introdotto nel 2009? Avrebbero potuto scegliere di non presentarlo affatto. Sono d'accordo che sembra molto simile a DOS per me (non nel modo giusto), ma può esserti utile di sicuro – Thomas

3

Non posso credere che nessuno ha inviare questa soluzione ancora (a scriverlo nel il mio stile PHP):

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

Complessità ancora O (1)

+0

Wow. Ma è ancora totalmente pervertito ... Abbiamo goto a nostra disposizione, possiamo anche usare un include() e tornare da lì, ma non possiamo semplicemente uscire dal blocco if ... – Marki

2

per me è meglio avere un indicatore di fuga in caso il codice deve uscire tra i blocchi, se non ti dispiace avere un se statisti t in un altro.

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

{...} 

Se si mantiene mettendo istruzioni condizionali intorno ad ogni blocco, non verrà eseguito alcun altri blocchi dopo aver impostato $ uscita su true. Puoi nominare la variabile $ continua e ripristinare i suoi ruoli se questo ha più senso per te.

funziona in modo semplice se non si dispone di altre istruzioni.

$exit = FALSE; 

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

A rigor di termini, non possiamo lasciare if -block prematuramente, ma a volte è veramente necessario. break può essere utilizzato solo all'interno di loop e switch -blocco. Ma possiamo inserire if in un ciclo. Quindi, la risposta di Marcos Fernandez Ramos è probabilmente la più appropriata. Ecco solo una variante leggermente più bella.

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

Prova questo

do { 

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

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

     do($bla); 
    } 

    /* You can do more comparisions here */ 

} while (0); 
0

Se si vuole veramente una dichiarazione da cui è possibile break, è possibile utilizzare un while dichiarazione:

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

Questo è un buon modo di evitare molti annidate le frasi if (che possono essere evitate in molti casi), ma fate attenzione al ciclo break.

0

se la sua condizione è una prova contro una singola variabile, allora l'istruzione switch è una soluzione molto migliore e si può facilmente uscire:

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 

funziona solo per i controlli di prove singole. Ha il vantaggio di gestire un mucchio di altro se.