web-dev-qa-db-fra.com

Est-ce que PHP avoir une évaluation de court-circuit?

É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 des conditions ultérieures telles que up_to_length($string)? Si oui, alors pourquoi fait-il un travail supplémentaire alors que ce n'est pas nécessaire?

61
Muntasir

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

Si vous voulez vérifier cela, essayez ceci: 

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

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

Oui. Voici une petite astuce qui repose sur l’évaluation des courts-circuits. Parfois, vous pourriez avoir une petite instruction if que vous préférez écrire en ternaire, par exemple:

    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 yes nécessite également l'exécution d'une fonction?

    if ($confirmed) {
        do_something();

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

Bien, réécrire en ternaire est encore possible, à cause de l'évaluation de court-circuit:

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

Dans ce cas, l'expression (do_something () || true) ne modifie en rien le résultat général du ternaire, mais garantit que do_something () n'est exécuté que si $ confirm est vrai.

7
Robert

En résumé donc:

Les opérateurs binaires sont & et |
Ils évaluent toujours les deux opérandes .

Les opérateurs logiques sont AND, OR, && et ||
AND et OR évaluent toujours les deux opérandes .

&& et || évaluez seulement le côté droit s'ils en ont besoin.

1
Steve Douglas

Non, les autres conditions ne sont plus vérifiées si la première condition n'est pas remplie.

1
Obay

D'après mes recherches, PHP ne semble pas avoir le même opérateur de court-circuit && que JavaScript.

J'ai couru ce test:

$one = true;

$two = 'Cabbage';

$test = $one && $two;

echo $test;

et PHP 7.0.8 a retourné 1, et non Cabbage.

0
agm1984

J'ai créé ma propre logique d'évaluation des courts-circuits. Malheureusement, la syntaxe rapide javascripts n'est pas la même chose, mais c'est peut-être une solution qui pourrait vous être utile:

$short_circuit_isset = function($var, $default_value = NULL) {
    return  (isset($var)) ? : $default_value;
};

$return_title = $short_circuit_isset( $_GET['returntitle'], 'God');

// Should return type 'String' value 'God', if get param is not set

Je ne me souviens plus d'où j'ai tiré la logique suivante, mais si vous procédez comme suit:

(isset($var)) ? : $default_value;

Vous pouvez éviter de devoir réécrire la variable de condition vraie après le point d'interrogation, par exemple:

(isset($super_long_var_name)) ? $super_long_var_name : $default_value;

Comme observation très importante , lorsque vous utilisez l'opérateur Ternary de cette façon, vous remarquerez que si une comparaison est effectuée, elle transmettra simplement la valeur de cette comparaison, car il n'y a pas qu'une seule variable . Par exemple:

$num = 1;
$num2 = 2;
var_dump( ($num < $num2) ? : 'oh snap' );
// outputs bool 'true'
0
Perspective