La priorité des opérateurs en PHP

Quelle est la différence entre && et AND, || et OR ?

07 janvier 2012

En PHP il existe de nombreux opérateurs avec pour chacun, une priorité sur les autres.

Dans cet article nous nous intéresserons à cinq d'entre eux : '=', '&&', 'AND', '||', 'OR'.

Comme vous l'avez déjà remarqué je pense, il existe deux opérateurs OU et deux opérateurs ET. La plupart des gens utilisent l'un ou l'autre en croyant qu'ils sont équivalents, je suis ici pour m'assurer que vous ne commettiez pas la même erreur.

En effet tous ces opérateurs sont de priorités différentes et ne pas savoir ça peut provoquer de drôles de situations. Ce phénomène est bien connu en mathématiques avec les opérateurs + et *.
2 + 3 * 4 est ainsi égal à 14 et non à 20 car la multiplication est prioritaire sur l'addition. Pour obtenir 20, il aurait été nécessaire d'utiliser des parenthèses (2 + 3) * 4 = 20. Si vous savez cela, vous comprendrez aisément ce qui va suivre.

Je réaliserai une suite de tests exécutés par PHP 5.3.6. Pour bien vous montrer le résultat des tests, il est nécessaire d'afficher toutes les erreurs, les deux premières lignes serviront à ça.

Tests de priorité des opérateurs

ini_set('display_errors', 1);
ini_set ("error_reporting", E_ALL);

/* Test 1 */
if ($test1 = "informatix" AND $count = strlen($test1))
echo "
Test 1 : ".$count; /* Test 2 */ if ($test2 = "informatix" && $count = strlen($test2)) echo "
Test 2 : ".$count; /* Test 3 */ $test3 = false OR true; echo "
Test3 : ".$test3; /* Test 4 */ $test4 = false || true; echo "
Test4 : ".$test4; /* Test 5 */ $test5 = false || false OR true; echo "
Test5 : ".$test5; /* Test 6 */ $test6 = false || true OR false; echo "
Test6 : ".$test6;

Et voici le résultat :

Test 1 : 10
Notice: Undefined variable: test2 in tests.php on line 12
Test3 :
Test4 : 1
Test5 :
Test6 : 1


OMFG c'est quoi ces résultats !!!

Test 1 : le '=' est plus prioritaire que le 'AND'

Rappel du test

if ($test1 = "informatix" AND $count = strlen($test1))
echo "
Test 1 : ".$count; /* Résultat : Test 1 : 10 */

Ici, aucun problème. $test1 prend la valeur "informatix", $count prend la valeur 10 (nombre de lettres dans "informatix"). Les affectations sont faites avant le ET logique.

Test 2 : le '=' est moins prioritaire que le '&&'

Rappel du test

if ($test2 = "informatix" && $count = strlen($test2))
echo "
Test 2 : ".$count; /* Résultat : Notice: Undefined variable: test2 in tests.php on line 12 */

C'est principalement à cause de ce test que cet article existe, car il ne fait pas que retourner un résultat sûrement non souhaité, il retourne en plus une jolie erreur.

Que c'est-il passé ?

Le && prend la priorité sur le =. PHP a donc tenté de tester la condition if ("informatix && strlen($test2)) avant de faire les affectations dans les variables. Or $test2 n'existe pas encore, il est donc impossible de la donner en paramètre à la fonction strlen().

Pour résoudre ce problème vous pouvez utiliser des parenthèses. On voit ainsi que :
($x = 'x') && ($y = 'y') est équivalent à $x = 'x' AND $y = 'y'.

Test 3 : le '=' est plus prioritaire que le 'OR'

Rappel du test

$test3 = false OR true;

echo "
Test3 : ".$test3; /* Résultat : Test3 : */

Ici le $test3 = false a été effectué avant le OU logique.

Test 4 : le '=' est moins prioritaire que le '||'

Rappel du test

$test4 = false || true;

echo "
Test4 : ".$test4; /* Résultat : Test4 : 1 */

Ici le false || true a été effectué avant l'affectation. Donc $test4 = true.

Test 5 et 6 : le 'OR' est moins prioritaire que le '||'

Rappel des tests

$test5 = false || false OR true;

echo "
Test5 : ".$test5; /* Résultat : Test5 : */ $test6 = false || true OR false; echo "
Test6 : ".$test6; /* Résultat : Test6 : 1 */

Avec les tests 3 et 4 on peut en déduire que :

  • = > OR
  • || > =
  • donc || > = > OR

Les tests 5 et 6 sont là pour vous le confirmer.
Execution du test 5 : false || false = false, $test5 = false.
Si le OR avait été prioritaire sur le || on aurait eu : false OR true = true, false || true = true, $test5 = true. On voit que ce n'est pas le cas...

Execution du test 6 : false || true = true, $test6 = true.

Pour conclure

Vous pouvez maintenant en déduire la priorité des cinq opérateurs présentés.

(&&, ||) > = > (AND, OR)

Dans la majorité des cas, je vous recommande d'utiliser AND et OR plutôt que && et || qui sont source de comportements non souhaités. J'espère que cet article vous a été utile et que vous ne ferez plus ces erreurs.

Bonne année 2012 aux Informatixiens.

Par
Créateur et administrateur.

Dans la même catégorie

Regexp en PHP, le mémo indispensable
La fonction isset et la valeur null
Les différentes façons de fusionner deux tableaux en PHP
Le lazy load en PHP

Commentaire(s)