Il y a quelques blagues, et des commentaires trompeurs, même des informations partiellement incorrectes dans les réponses ici. Je voudrais essayer de les améliorer:
Première, comme certains l'ont souligné, vous avez un bug dans votre code qui se rapporte à la question:
if ($status = 'clear' AND $pRent == 0)
devrait être (noter la ==
au lieu de =
dans la première partie):
if ($status == 'clear' AND $pRent == 0)
qui dans ce cas est fonctionnellement équivalent à
if ($status == 'clear' && $pRent == 0)
Deuxième, notez que ces opérateurs (and or && ||
) sont des opérateurs de court-circuit. Cela signifie que si la réponse peut être déterminée avec certitude à partir de la première expression, la seconde n'est jamais évaluée.Encore une fois cela n'a pas d'importance pour votre ligne ci-dessus débogué, mais il est extrêmement important lorsque vous combinez ces opérateurs avec des missions, parce que
Troisième, la vraie différence entre and or
et && ||
est leur operator precedence. Plus précisément, l'importance est que && ||
ont une priorité plus élevée que les opérateurs d'affectation (= += -= *= **= /= .= %= &= |= ^= <<= >>=
) tandis que and or
ont une précocité inférieure à celle des opérateurs d'affectation. Ainsi, dans une déclaration qui combine l'utilisation de l'affectation et de l'évaluation logique, il importe quelle vous choisissez.
exemples modifiés de PHP's page on logical operators:
$e = false || true;
évaluera à true
et attribuer cette valeur à $e
, parce que ||
a priorité de l'opérateur supérieur à =
, et donc il évalue essentiellement comme ceci:
$e = (false || true);
cependant
$e = false or true;
attribuera false
-$e
(puis effectuer l'opération or
et évaluer true
) parce que =
a priorité de l'opérateur supérieur à or
, évaluer essentiellement comme ceci:
($e = false) or true;
Le fait que cette ambiguïté existe même fait beaucoup des programmeurs utilisent toujours && ||
et tout fonctionne comme dans un langage comme C, ie. opérations logiques en premier, puis affectation.
Certaines langues comme Perl utilisent ce type de construction souvent dans un format similaire à ceci:
$connection = database_connect($parameters) or die("Unable to connect to DB.");
Cela pourrait affecter théoriquement la connexion de base de données $connection
, ou si cela a échoué (et nous supposons ici la fonction retournerait quelque chose qui évalue à false
dans ce cas), il terminera le script avec un message d'erreur. En raison du court-circuit, si la connexion à la base de données réussit, le die()
n'est jamais évalué.
Certaines langues qui permettent cette construction tout droit interdisent les affectations dans les instructions conditionnelles/logiques (comme Python) pour supprimer l'ambiguïté dans l'autre sens.
PHP est allé avec permettre les deux, de sorte que vous avez juste besoin de connaître vos deux options une fois et puis coder comme vous le souhaitez, mais j'espère que vous serez cohérent d'une manière ou d'une autre. En cas de doute, ajoutez simplement un jeu de parenthèses supplémentaire, ce qui supprime toute ambiguïté. Ceux-ci seront toujours les mêmes:
$e = (false || true);
$e = (false or true);
Armé de toutes ces connaissances, je préfère utiliser and or
parce que je sens qu'il rend le code plus lisible. J'ai juste une règle de ne pas combiner des affectations avec des évaluations logiques. Mais à ce stade, c'est juste une préférence, et la cohérence importe beaucoup plus ici que de quel côté vous choisissez.
Et juste pour fins de complétions, '===' est pour la comparaison de type + valeur. Dans le futur, PHP inclura également '====' pour vérifier que les classes ont été écrites par le même programmeur, '=====' pour s'assurer qu'elles ont été écrites le même jour, et '===== = 'S'assurer que le programmeur portait un pantalon à ce moment-là. – AgentConundrum
@Agent J'ajouterais '=============' pour m'assurer que la spécification du projet n'a pas changé depuis que le code a été écrit. – deceze
@deceze - Bon, mais seulement s'il retourne toujours 'FALSE' – AgentConundrum