web-dev-qa-db-fra.com

PHP - sortir du bloc IF

Comment puis-je sortir d'un bloc if si une certaine condition est remplie?

J'ai essayé d'utiliser break mais cela ne fonctionne pas:

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

il dit: Erreur fatale: impossible de casser/continuer 1 niveau dans ...

15
Alex

Pourquoi ne pas simplement le retourner.

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

De cette façon, votre code ne sera exécuté que si $ bla n'est pas vide .. C'est un peu le problème avec if-statement

8
Sondre

Dans PHP 5.3, vous pouvez utiliser goto

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

Mais personnellement, je pense que c'est une solution laide.

36
Burak Guzel

Vous ne pouvez pas casser si des déclarations, seulement des boucles comme pour ou tout le temps.

Si ceci est dans une fonction, utilisez 'return'.

12
Oli

Je ne peux pas croire que personne n'ait encore posté cette solution (en l'écrivant dans mon style PHP):

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

Complexité encore O (1)

3

Pour moi, il est utile d’avoir un marqueur d’échappement au cas où le code doit sortir entre des blocs si cela ne vous dérange pas d’avoir une instruction if dans un autre.

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

{...}

Si vous continuez à placer des instructions conditionnelles autour de chaque bloc, il n'exécutera aucun autre bloc après avoir défini $ exit sur true. Vous pouvez nommer la variable $ continue et inverser ses rôles si cela vous semble plus logique.

cela fonctionne plus facilement si vous n'avez pas d'autre déclaration.

$exit = FALSE;

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

Tu ne peux pas. 

Vous pouvez mettre le tout dans une fonction à partir de laquelle vous pouvez return.

Sinon, vous devrez changer la logique et inclure un autre bloc if.

if($bla): 
  $bla = get_bla();
  if(!empty($bla)): 
   do($bla);
  endif;
endif;
2
Pekka 웃

si votre condition est un test sur une seule variable, l'instruction switch est une bien meilleure solution et vous pouvez facilement l'éclairer:

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

Cela ne fonctionne que pour les tests simples. A l'avantage de gérer un tas d'autres si.

0
Jacques Amar

Si vous voulez vraiment une instruction à partir de laquelle vous pouvez break, vous pouvez utiliser une instruction 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;
}

C'est un bon moyen d'éviter de nombreuses instructions if imbriquées (ce qui peut peut-être être évité dans de nombreux cas), mais faites attention à break la boucle.

0
Marian

Strictement parlant, nous ne pouvons pas laisser if- block prématurément, mais parfois c'est vraiment nécessaire. break ne peut être utilisé que dans les boucles et switch- block. Mais nous pouvons placer if dans une boucle. La réponse de Marcos Fernandez Ramos est donc probablement la plus appropriée. Voici une variante légèrement plus agréable.

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

Essaye ça

do {

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

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

        do($bla);
    }

    /* You can do more comparisions here */

} while (0);
0
Greeso