85 votes

PHP dispose-t-il d'une évaluation des courts-circuits ?

Étant donné le code suivant :

if (is_valid($string) && up_to_length($string) && file_exists($file)) 
{
    ......
}

Si is_valid($string) renvoie à false l'interpréteur php vérifie-t-il toujours les conditions ultérieures, comme par exemple up_to_length($string) ?
Si c'est le cas, alors pourquoi fait-il du travail supplémentaire alors qu'il n'est pas obligé de le faire ?

111voto

Zach Rattner Points 5849

Oui, l'interpréteur PHP est "paresseux", ce qui signifie qu'il fera le nombre minimum de comparaisons possibles pour évaluer les conditions.

Si vous voulez le vérifier, essayez ceci :

function saySomething()
{
    echo 'hi!';
    return true;
}

if (false && saySomething())
{
    echo 'statement evaluated to true';
}

11voto

Steve Douglas Points 135

Opérateurs binaires son & y | . Ils évaluent toujours les deux opérandes.

Opérateurs logiques son AND , OR , && y || .

  • Les quatre opérateurs n'évaluent le côté droit que s'ils en ont besoin.
  • AND y OR ont une priorité moindre que && y || . Voir l'exemple ci-dessous.

Extrait du manuel PHP :

// The result of the expression (false || true) is assigned to $e
// Acts like: ($e = (false || true))
$e = false || true;

// The constant false is assigned to $f before the "or" operation occurs
// Acts like: (($f = false) or true)
$f = false or true;

Dans cet exemple, e sera true y f sera false .

11voto

Robert Points 579

Oui, c'est vrai. Voici une petite astuce qui repose sur l'évaluation des courts-circuits. Parfois, vous pouvez avoir une petite instruction if que vous préféreriez écrire comme un ternaire, par ex :

    if ($confirmed) {
        $answer = 'Yes';
    } else {
        $answer = 'No';
    }

Peut être réécrit comme :

   $answer = $confirmed ? 'Yes' : 'No';

Mais alors, que se passe-t-il si le bloc oui nécessite également l'exécution d'une fonction ?

    if ($confirmed) {
        do_something();

        $answer = 'Yes';
    } else {
        $answer = 'No';
    }

La réécriture en ternaire est toujours possible, à cause de l'évaluation en court-circuit :

    $answer = $confirmed && (do_something() || true) ? 'Yes' : 'No';

Dans ce cas, l'expression (do_something() || true) ne modifie en rien le résultat global du ternaire, mais garantit que la condition ternaire demeure true en ignorant la valeur de retour de do_something() .

6voto

agm1984 Points 3539

D'après mes recherches, il semble que PHP n'ait pas le même problème que les autres. && opérateur de court-circuit comme JavaScript.

J'ai fait ce test :

$one = true;

$two = 'Cabbage';

$test = $one && $two;

echo $test;

et PHP 7.0.8 renvoie 1 pas Cabbage .

4voto

Aaron W. Points 5431

Quelques lectures pour accompagner toutes ces réponses : http://en.wikipedia.org/wiki/Short-circuit_evaluation

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X