Question

J'ai une question intéressante sur la façon dont PHP évalue les expressions booléennes. Lorsque vous avez, par exemple,

$expression = $expression1 and $expression2;

ou

if ($expression1 and $expression2)

PHP vérifie d'abord si $expression1 évalue à true . Si ce n'est pas le cas, alors $expression2 est simplement ignorée pour éviter les calculs inutiles. Dans un scénario que je vous écris, j'ai:

if ($validator->valid("title") and $validator->valid("text"))

Je dois avoir la deuxième déclaration ($validator->valid("text")) évaluée, même si la première est évaluée à false. Je voudrais vous demander s'il y a un moyen facile de forcer PHP à évaluer toujours les deux déclarations. Merci!

Était-ce utile?

La solution

Ceci est connu comme évaluation court-circuit , et pour l'éviter que vous devez faire ce, en utilisant un seul &:

if($validator->valid("title") & $validator->valid("text")) {

}

Notez que ce n'utilise pas opérateurs logiques mais en fait opérateurs au niveau du bit:

  

Ils sont les opérateurs qui agissent sur les représentations binaires des nombres. Elles ne tiennent pas les valeurs logiques (à savoir, « vrai » ou « faux ») comme arguments sans les convertir d'abord les chiffres 1 et 0 respectivement. Ils ne renvoient des valeurs logiques, mais les chiffres. Bien sûr, vous pouvez ensuite traiter ces chiffres comme si elles étaient des valeurs logiques (dans ce cas, 0 est jeté à « faux » et toute autre chose est coulé à « vrai »), mais qui est une conséquence des règles de coulée de type PHP, et rien à faire avec le comportement des opérateurs.

En tant que tel, il est un débat de savoir s'il est bon d'utiliser cet effet secondaire pour contourner l'évaluation de court-circuit. Personnellement, je au moins mettre un commentaire que le & est intentionnel, mais si vous voulez être aussi pur que possible, vous devez évaluer si elles sont valables d'abord, puis faire le cas.

Autres conseils

$isValidTitle = $validator->valid("title");
$isValidText = $validator->valid("text");
if($isValidTitle && $isValidText)
{
    ...
}

Est-ce que ce costume?

essayer d'évaluer séparément chaque terme:

$term1 = $validator->valid("title");
$term2 = $validator->valid("text");
if($term1 && $term2) {
//things to do
}

Cela pourrait ne pas être la meilleure mise en œuvre, mais vous pouvez toujours faire:

$a=$validator->valid("title");
$b=$validator->valid("text");
if($a && $b) {...}

Vous pouvez définir une fonction comme:

function logical_and($x,$y) {return ($x && $y);}

Depuis PHP utilise l'appel par valeur, cela fonctionne.

Par ailleurs, si vous pouvez modifier le validateur classe $ instancier, vous pourriez faire la méthode valide accepter une chaîne ou un tableau. Si c'est un tableau, il exécute le code qui existe déjà sur chaque élément et retourne vrai que si tous les éléments sont « valides ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top