Les opérateurs Un opérateur est quelque chose qui prend une ou plusieurs valeurs (ou expressions, dans le jargon de la programmation) et qui retourne une autre valeur (donc la construction elle-même devient une expression). Les opérateurs peuvent être regroupés en fonction du nombre de valeurs qu'ils acceptent. L'opérateur unaire n'opère que sur une seule valeur, par exemple ! (l'opérateur de négation) ou ++ (l'opérateur d'incrémentation). Le second type, les opérateurs binaires (comme le très célèbre opérateur mathématique + ou -) contient la plupart des opérateurs supportés par PHP. Enfin, l'opérateur ternaire, ? :, qui accepte trois valeurs (on peut aussi l'appeler l'opérateur conditionnel). Une liste complète des opérateurs se trouve dans la section précédence des opérateurs. Cette section explique aussi la précédence des opérateurs et l'associativité, c'est à dire les priorités d'exécution des opérateurs. La priorité des opérateurs La priorité des opérateurs spécifie l'ordre dans lequel les valeurs doivent être analysées. Par exemple, dans l'expression 1 + 5 * 3, le résultat est 16 et non 18, car la multiplication ("*") a une priorité supérieure par rapport à l'addition ("+"). Des parenthèses peuvent être utilisées pour forcer la priorité, si nécessaire. Par exemple : (1 + 5) * 3 donnera 18. Lorsque les opérateurs ont une priorité égale, leur association décide la façon dont les opérateurs sont groupés. Par exemple, "-" est une association par la gauche, ainsi 1 - 2 - 3 est groupé comme ceci (1 - 2) - 3 et sera évalué à -4. D'un autre côté, "=" est une association par la droite, ainsi, $a = $b = $c est groupé comme ceci $a = ($b = $c). Les opérateurs, dont la priorité est égale, qui ne sont pas associatifs, ne peuvent pas être utilisés entre eux, par exemple, 1 < 2 > 1 est interdit en PHP. L'expression 1 <= 1 == 1 par contre, est autorisée, car l'opérateur == a une précédence inférieure que l'opérateur <=. L'associativité à uniquement du sens pour les opérateurs binaire (et ternaire). Les opérateurs unitaires sont soit préfixé soit suffixé ainsi cette notion n'est pas applicable. Par exemple !!$a peut uniquement être groupé de la manière suivante !(!$a). L'utilisation des parenthèses, y compris lorsqu'elles ne sont pas nécessaires, permet de mieux lire le code en effectuant des groupements explicites plutôt qu'imaginer la priorité des opérateurs et leurs associations. Le tableau qui suit liste les opérateurs par ordre de priorité, avec la priorité la plus élevée en haut. Les opérateurs sur la même ligne ont une priorité équivalente (donc l'associativité décide du groupement). Priorité des opérateurs Associativité Opérateurs Information additionnelle (n/a) clone new clone et new droite ** arithmétique (n/a) + - ++ -- ~ (int) (float) (string) (array) (object) (bool) @ arithmétique (unitaire + et -), incrément/décrément bit à bit, casting de type&listendand; contrôle d'erreur gauche instanceof type (n/a) ! logique gauche * / % arithmétique gauche + - . arithmétique (binaire + et -), tableau&listendand; chaîne de caractères (. antérieur à PHP 8.0.0) gauche << >> bitwise gauche . string (à partir de PHP 8.0.0) non-associatif < <= > >= comparaison non-associatif == != === !== <> <=> comparaison gauche & bitwise&listendand; références gauche ^ bitwise gauche | bitwise gauche && logique gauche || logique droite ?? coalescence nul non-associatif ? : ternaire (gauche--associatif antérieur à PHP 8.0.0) droite = += -= *= **= /= .= %= &= |= ^= <<= >>= ??= affectation (n/a) yield from yield from (n/a) yield yield (n/a) print print gauche and logique gauche xor logique gauche or logique
Associativité $a = 5, $b = 5 ?> ]]> La priorité et l'association de l'opérateur ne déterminent que la façon dont les expressions sont groupées ; ils ne spécifient pas l'ordre de l'évaluation. PHP ne spécifie pas (de manière générale) l'ordre dans lequel une expression est évaluée et le code qui suppose un ordre spécifique d'évaluation ne devrait pas exister, car le comportement peut changer entre les différentes versions de PHP ou suivant le code environnant. Ordre d'évaluation indéfini ]]> <literal>+</literal>, <literal>-</literal> et <literal>.</literal> ont la même priorité (antérieur à PHP 8.0.0) ]]> &example.outputs; Bien que = soit prioritaire sur la plupart des opérateurs, PHP va tout de même exécuter des expressions comme : if (!$a = foo()). Dans cette situation, le résultat de foo() sera placé dans la variable $a. &reftitle.changelog; &Version; &Description; 8.0.0 La concaténation de chaînes de caractères (.) a désormais une précédence moins élevée que l'addition/soustraction arithmétique (+ et -) et les shifts bit-à-bit gauche/droite (<< et >>); auparavant ceci avait la même précédence que + et -, et une précédence plus élevée que << et >>. 8.0.0 L'opérateur ternaire (? :) est désormais non associatif ; auparavant il était gauche-associatif. 7.4.0 Dépendre de la précédence de la concaténation de chaînes de caractères (.) relatif à l'addition/soustraction arithmétique (+ ou -) ou les shifts bit-à-bit gauche/droite (<< ou >>), i.e. les utiliser ensemble dans une expression sans parenthèse, est obsolète. 7.4.0 Dépendre de la gauche-associativité de l'opérateur ternaire (? :), c.-à-d. l'imbrication de plusieurs opérateurs ternaires qui ne sont pas entre parenthèse, est obsolète.
Les opérateurs arithmétiques Vous rappelez-vous des opérations élémentaires apprises à l'école ? Les opérateurs arithmétiques fonctionnent comme elles. Opérations élémentaires Exemple Nom Résultat +$a Identité Conversion de $a vers int ou float, selon le plus approprié. -$a Négation Opposé de $a. $a + $b Addition Somme de $a et $b. $a - $b Soustraction Différence de $a et $b. $a * $b Multiplication Produit de $a et $b. $a / $b Division Quotient de $a et $b. $a % $b Modulus Reste de $a divisé par $b. $a ** $b Exponentiation Résultat de l'élévation de $a à la puissance $b.
L'opérateur de division ("/") retourne une valeur à virgule flottante sauf si les 2 opérandes sont des entiers (ou une &string; qui a été convertie en entiers) et que leur division est exacte (i.e. a pour reste 0), auquel cas une valeur entière sera retournée. Pour la division entière, voir intdiv. Les opérandes du modulo sont converties en int avant exécution. Pour le modulo sur des nombres décimaux, voir fmod. Le résultat de l'opération modulo % a le même signe que le premier opérande, ansi le résultat de $a % $b aura le signe de $a. Par exemple: ]]> &reftitle.seealso; Les fonctions mathématiques
Les opérateurs d'affectation L'opérateur d'affectation le plus simple est le signe "=". Le premier réflexe est de penser que ce signe veut dire "égal à". Ce n'est pas le cas. Il signifie que l'opérande de gauche se voit affecter la valeur de l'expression qui est à droite du signe égal. La valeur d'une expression d'affectation est la valeur affectée. Par exemple, la valeur de l'expression '$a = 3' est la valeur 3. Cela permet d'utiliser des astuces telles que : ]]> En plus du simple opérateur d'affectation, il existe des "opérateurs combinés" pour tous les opérateurs arithmétiques, l'union de tableaux et pour les opérateurs sur les chaînes de caractères. Cela permet d'utiliser la valeur d'une variable dans une expression et d'affecter le résultat de cette expression à cette variable. Par exemple : ]]> On peut noter que l'affectation copie le contenu de la variable originale dans la nouvelle variable (affectation par valeur), ce qui fait que les changements de valeur d'une variable ne modifieront pas la valeur de l'autre. Cela peut se révéler important lors de la copie d'un grand tableau durant une boucle. Une exception au comportement d'affectation par valeur en PHP est le type object, ceux-ci sont affectés par référence. La copie d'objet doit être explicitement demandée grâce au mot-clé clone. Affectation par référence L'affectation par référence est aussi supportée, au moyen de la syntaxe "$var = &$othervar;". L'affectation par référence signifie que les deux variables pointent vers le même conteneur de donnée, rien n'est copié nulle part. Affectation par référence ]]> L'opérateur new retourne une référence automatiquement, de ce fait, assigner le résultat de new par référence est une erreur ]]> &example.outputs; Plus d'informations sur les références et leurs utilisations possibles peuvent être trouvées dans la section du manuel Les références expliquées. Les opérateurs d'affectation arithmétiques Exemple Equivalent Opération $a += $b $a = $a + $b Addition $a -= $b $a = $a - $b Soustraction $a *= $b $a = $a * $b Multiplication $a /= $b $a = $a / $b Division $a %= $b $a = $a % $b Modulo $a **= $b $a = $a ** $b Exponentiation Opérateurs d'affectation bits à bits Exemple Equivalent Opération $a &= $b $a = $a & $b Opérateur And $a |= $b $a = $a | $b Opérateur Or $a ^= $b $a = $a ^ $b Opérateur Xor $a <<= $b $a = $a << $b Décalage à gauche $a >>= $b $a = $a >> $b Décalage à droite Autres opérateurs d'affectation Exemple Equivalent Opération $a .= $b $a = $a . $b Concaténation d'une chaîne de caractères $a ??= $b $a = $a ?? $b Opérateur de coalescence nul &reftitle.seealso; les opérateurs arithmétiques les opérateurs bits à bits les opérateurs de coalescence nul Opérateurs sur les bits Les opérateurs sur les bits vous permettent de manipuler les bits dans un entier. Les opérateurs sur les bits Exemple Nom Résultat $a & $b And (Et) Les bits positionnés à 1 dans $a ET dans $b sont positionnés à 1. $a | $b Or (Ou) Les bits positionnés à 1 dans $a OU $b sont positionnés à 1. $a ^ $b Xor (ou exclusif) Les bits positionnés à 1 dans $a OU dans $b mais pas dans les deux sont positionnés à 1. ~ $a Not (Non) Les bits qui sont positionnés à 1 dans $a sont positionnés à 0, et vice-versa. $a << $b Décalage à gauche Décale les bits de $a, $b fois sur la gauche (chaque décalage équivaut à une multiplication par 2). $a >> $b Décalage à droite Décale les bits de $a, $b fois sur la droite (chaque décalage équivaut à une division par 2).
Le décalage de bits en PHP est arithmétique. Les bits qui sont décalés hors de l'entier sont perdus. Les décalages à gauche font apparaître des zéros à droite, tandis que le bit de signe est décalé à gauche, ce qui signifie que le signe de l'entier n'est pas préservé. Les décalages à droite décalent aussi le bit de signe sur la droite, ce qui signifie que le signe est préservé. Utilisez des parenthèses pour vous assurer que la précédence voulue est bien appliquée. Par exemple, $a & $b == true applique d'abord l'égalité, et ensuite le ET logique, alors que ($a & $b) == true applique d'abord le ET logique, puis l'égalité. Si les deux opérandes pour les opérateurs &, | et ^ sont des chaines de caractères, alors l'opération sera réalisée sur les valeurs ASCII des caractères et le résultat sera une chaine de caractères. Dans tous les autres cas, les deux opérandes seront converties en entier et le résultat sera un entier. Si l'opérande pour l'opérateur ~ operator est une chaine de caractères, l'opération sera effectuée sur les caractères ASCII composant la chaine et le résultat sera une chaine de caractères. Sinon l'opérande et le résultat seront traités comme des entiers. Les opérandes et le résultat des opérateurs << et >> sont traités comme des entiers. Le rapport d'erreur de PHP utilise des champs de bits, qui sont une illustration de l'extinction des bits. Pour afficher les erreurs, sauf les notices, les instructions du php.ini sont : E_ALL & ~E_NOTICE Cela se comprend en comparant avec E_ALL : 00000000000000000111011111111111 Puis en éteignant la valeur de E_NOTICE... 00000000000000000000000000001000 ... et en l'inversant via ~: 11111111111111111111111111110111 Finalement, on utilise le ET logique (&) pour lire les bits activés dans les deux valeurs : 00000000000000000111011111110111 Un autre moyen d'arriver à ce résultat est d'utiliser le OU exclusif (^), qui cherche les bits qui ne sont activés que dans l'une ou l'autre des valeurs, exclusivement : E_ALL ^ E_NOTICE error_reporting peut aussi être utilisé pour illustrer l'activation de bits. Pour afficher uniquement les erreurs et les erreurs recouvrables, on utilise : E_ERROR | E_RECOVERABLE_ERROR Cette approche combine E_ERROR 00000000000000000000000000000001 et E_RECOVERABLE_ERROR 00000000000000000001000000000000 Avec l'opérateur OR (|) pour s'assurer que les bits sont activés dans l'une ou l'autre valeur : 00000000000000000001000000000001 Opérations sur les bits et les entiers ]]> &example.outputs; Opération sur les bits et les chaînes ]]> Décalage de bits sur les entiers > $places; p($res, $val, '>>', $places, 'copie du bit de signe maintenant à gauche'); $val = 4; $places = 2; $res = $val >> $places; p($res, $val, '>>', $places); $val = 4; $places = 3; $res = $val >> $places; p($res, $val, '>>', $places, 'des bits sont sortis par la droite'); $val = 4; $places = 4; $res = $val >> $places; p($res, $val, '>>', $places, 'même résultat que ci-dessus : pas de décalage au dela de 0'); echo "\n--- Décalages à droite sur des entiers négatifs ---\n"; $val = -4; $places = 1; $res = $val >> $places; p($res, $val, '>>', $places, 'copie du bit de signe maintenant à gauche'); $val = -4; $places = 2; $res = $val >> $places; p($res, $val, '>>', $places, 'des bits sont sortis par la droite'); $val = -4; $places = 3; $res = $val >> $places; p($res, $val, '>>', $places, 'même résultat que ci-dessus : pas de décalage au dela de -1'); echo "\n--- Décalages à gauche sur des entiers positifs ---\n"; $val = 4; $places = 1; $res = $val << $places; p($res, $val, '<<', $places, 'complément de zéros à droite'); $val = 4; $places = (PHP_INT_SIZE * 8) - 4; $res = $val << $places; p($res, $val, '<<', $places); $val = 4; $places = (PHP_INT_SIZE * 8) - 3; $res = $val << $places; p($res, $val, '<<', $places, 'le bit de signe est sorti'); $val = 4; $places = (PHP_INT_SIZE * 8) - 2; $res = $val << $places; p($res, $val, '<<', $places, 'des bits sont sortis à gauche'); echo "\n--- Décalages à gauche sur des entiers négatifs ---\n"; $val = -4; $places = 1; $res = $val << $places; p($res, $val, '<<', $places, 'complément de zéros à droite'); $val = -4; $places = (PHP_INT_SIZE * 8) - 3; $res = $val << $places; p($res, $val, '<<', $places); $val = -4; $places = (PHP_INT_SIZE * 8) - 2; $res = $val << $places; p($res, $val, '<<', $places, 'des bits sont sortis à gauche, y compris le bit de signe'); /* * Ignorez cette section * Elle contient du code pour le formatage de cet exemple */ function p($res, $val, $op, $places, $note = '') { $format = '%0' . (PHP_INT_SIZE * 8) . "b\n"; printf("Expression : %d = %d %s %d\n", $res, $val, $op, $places); echo " Décimal :\n"; printf(" val=%d\n", $val); printf(" res=%d\n", $res); echo " Binaire :\n"; printf(' val=' . $format, $val); printf(' res=' . $format, $res); if ($note) { echo " Note : $note\n"; } echo "\n"; } ?> ]]> &example.outputs.32bit; > 1 Décimal : val=4 res=2 Binaire : val=00000000000000000000000000000100 res=00000000000000000000000000000010 Note : copie du bit de signe maintenant à gauche Expression : 1 = 4 >> 2 Décimal : val=4 res=1 Binaire : val=00000000000000000000000000000100 res=00000000000000000000000000000001 Expression : 0 = 4 >> 3 Décimal : val=4 res=0 Binaire : val=00000000000000000000000000000100 res=00000000000000000000000000000000 Note : des bits sont sortis par la droite Expression : 0 = 4 >> 4 Décimal : val=4 res=0 Binaire : val=00000000000000000000000000000100 res=00000000000000000000000000000000 Note : même résultat que ci-dessus : pas de décalage au dela de 0 --- Décalages à droite sur des entiers négatifs --- Expression : -2 = -4 >> 1 Décimal : val=-4 res=-2 Binaire : val=11111111111111111111111111111100 res=11111111111111111111111111111110 Note : copie du bit de signe à gauche Expression : -1 = -4 >> 2 Décimal : val=-4 res=-1 Binaire : val=11111111111111111111111111111100 res=11111111111111111111111111111111 Note : des bits sont sortis par la droite Expression : -1 = -4 >> 3 Décimal : val=-4 res=-1 Binaire : val=11111111111111111111111111111100 res=11111111111111111111111111111111 Note : même résultat que ci-dessus : pas de décalage au dela de -1 --- Décalages à gauche sur des entiers positifs --- Expression : 8 = 4 << 1 Décimal : val=4 res=8 Binaire : val=00000000000000000000000000000100 res=00000000000000000000000000001000 Note : complément de zéros à droite Expression : 1073741824 = 4 << 28 Décimal : val=4 res=1073741824 Binaire : val=00000000000000000000000000000100 res=01000000000000000000000000000000 Expression : -2147483648 = 4 << 29 Décimal : val=4 res=-2147483648 Binaire : val=00000000000000000000000000000100 res=10000000000000000000000000000000 Note : le bit de signe est sorti Expression : 0 = 4 << 30 Décimal : val=4 res=0 Binaire : val=00000000000000000000000000000100 res=00000000000000000000000000000000 Note : des bits sont sortis à gauche --- Décalages à gauche sur des entiers négatifs --- Expression : -8 = -4 << 1 Décimal : val=-4 res=-8 Binaire : val=11111111111111111111111111111100 res=11111111111111111111111111111000 Note : complément de zéros à droite Expression : -2147483648 = -4 << 29 Décimal : val=-4 res=-2147483648 Binaire : val=11111111111111111111111111111100 res=10000000000000000000000000000000 Expression : 0 = -4 << 30 Décimal : val=-4 res=0 Binaire : val=11111111111111111111111111111100 res=00000000000000000000000000000000 Note : des bits sont sortis à gauche, y compris le bit de signe ]]> &example.outputs.64bit; > 1 Décimal : val=4 res=2 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000010 Note : copie du bit de signe maintenant à gauche Expression : 1 = 4 >> 2 Décimal : val=4 res=1 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000001 Expression : 0 = 4 >> 3 Décimal : val=4 res=0 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 Note : des bits sont sortis par la droite Expression : 0 = 4 >> 4 Décimal : val=4 res=0 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 Note : même résultat que ci-dessus : pas de décalage au dela de 0 --- Décalages à droite sur des entiers négatifs --- Expression : -2 = -4 >> 1 Décimal : val=-4 res=-2 Binaire : val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111110 Note : copie du bit de signe maintenant à gauche Expression : -1 = -4 >> 2 Décimal : val=-4 res=-1 Binaire : val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111111 Note : des bits sont sortis par la droite Expression : -1 = -4 >> 3 Décimal : val=-4 res=-1 Binaire : val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111111 Note : même résultat que ci-dessus : pas de décalage au dela de -1 --- Décalage à gauche sur les entiers négatifs --- Expression : 8 = 4 << 1 Décimal : val=4 res=8 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000001000 Note : complément de zéros à droite Expression : 4611686018427387904 = 4 << 60 Décimal : val=4 res=4611686018427387904 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0100000000000000000000000000000000000000000000000000000000000000 Expression : -9223372036854775808 = 4 << 61 Décimal : val=4 res=-9223372036854775808 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=1000000000000000000000000000000000000000000000000000000000000000 Note : le bit de signe est sorti Expression : 0 = 4 << 62 Décimal : val=4 res=0 Binaire : val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 Note : des bits sont sortis à gauche --- Décalage à gauche sur les entiers négatifs --- Expression : -8 = -4 << 1 Décimal : val=-4 res=-8 Binaire : val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111000 Note : complément de zéros à droite Expression : -9223372036854775808 = -4 << 61 Décimal : val=-4 res=-9223372036854775808 Binaire : val=1111111111111111111111111111111111111111111111111111111111111100 res=1000000000000000000000000000000000000000000000000000000000000000 Expression : 0 = -4 << 62 Décimal : val=-4 res=0 Binaire : val=1111111111111111111111111111111111111111111111111111111111111100 res=0000000000000000000000000000000000000000000000000000000000000000 Note : des bits sont sortis à gauche, y compris le bit de signe ]]> Utilisez les fonctions de l'extension gmp pour les manipulations sur les bits, lorsque les entiers dépassent PHP_INT_MAX. &reftitle.seealso; pack unpack gmp_and gmp_or gmp_xor gmp_testbit gmp_clrbit
Opérateurs de comparaison Les opérateurs de comparaison, comme leur nom l'indique, vous permettent de comparer deux valeurs. Vous devriez également être intéressés par les tables de comparaisons de types, car ils montrent des exemples de beaucoup de types de comparaisons. Opérateurs de comparaison Exemple Nom Résultat $a == $b Égal &true; si $a est égal à $b après le transtypage. $a === $b Identique &true; si $a est égal à $b et qu'ils sont de même type. $a != $b Différent &true; si $a est différent de $b après le transtypage. $a <> $b Différent &true; si $a est différent de $b après le transtypage. $a !== $b Différent &true; si $a est différent de $b ou bien s'ils ne sont pas du même type. $a < $b Plus petit que &true; si $a est strictement plus petit que $b. $a > $b Plus grand &true; si $a est strictement plus grand que $b. $a <= $b Inférieur ou égal &true; si $a est plus petit ou égal à $b. $a >= $b Supérieur ou égal &true; si $a est plus grand ou égal à $b. $a <=> $b Combiné Un &integer; inférieur, égal ou supérieur à zéro lorsque $a est inférieur, égal, ou supérieur à $b respectivement.
Si les deux opérandes sont des chaînes numériques, ou si un opérande est un nombre et l'autre est une chaîne numérique, alors la comparaison sera effectuée numériquement. Ces règles s'appliquent également à l'instruction switch. La conversion de type n'intervient pas lorsque la comparaison est === ou !== vu que ceci engendre aussi bien une comparaison de type que de valeur. Antérieur à PHP 8.0.0, si une string est comparé à un nombre ou à une chaîne numérique alors la string sera convertie en un nombre avant d'effectuer la comparaison. Ceci peut mener à des résultats surprenant comme il peut être vu avec l'exemple suivant : ]]> &example.outputs.7; &example.outputs.8; 1; // 0 echo 1 <=> 2; // -1 echo 2 <=> 1; // 1 // Nombre flottants echo 1.5 <=> 1.5; // 0 echo 1.5 <=> 2.5; // -1 echo 2.5 <=> 1.5; // 1 // Chaines de caractères echo "a" <=> "a"; // 0 echo "a" <=> "b"; // -1 echo "b" <=> "a"; // 1 echo "a" <=> "aa"; // -1 echo "zz" <=> "aa"; // 1 // Tableaux echo [] <=> []; // 0 echo [1, 2, 3] <=> [1, 2, 3]; // 0 echo [1, 2, 3] <=> []; // 1 echo [1, 2, 3] <=> [1, 2, 1]; // 1 echo [1, 2, 3] <=> [1, 2, 4]; // -1 // Objets $a = (object) ["a" => "b"]; $b = (object) ["a" => "b"]; echo $a <=> $b; // 0 $a = (object) ["a" => "b"]; $b = (object) ["a" => "c"]; echo $a <=> $b; // -1 $a = (object) ["a" => "c"]; $b = (object) ["a" => "b"]; echo $a <=> $b; // 1 // non seulement les valeurs sont comparées; les clés doivent correspondre $a = (object) ["a" => "b"]; $b = (object) ["b" => "b"]; echo $a <=> $b; // 1 ?> ]]> Pour les différents types, la comparaison est faite en suivant la table suivante (dans l'ordre). Comparaison avec plusieurs types Type de l'opérande 1 Type de l'opérande 2 Résultat null ou string string Convertit &null; en "", comparaison numérique ou lexicale bool ou null N'importe quoi Convertit en bool, &false; < &true; object object Les classes internes peuvent définir leur propre méthode de comparaison ; différentes classes sont incomparables ; entre objets de même classe voir Comparaison d'objet &string;, &resource;, &integer; ou &float; &string;, &resource;, &integer; ou &float; Transforme les chaînes de caractères et les ressources en nombres array array Le tableau avec le moins de membres est plus petit, si la clé de l'opérande 1 n'est pas trouvée dans l'opérande 2, alors les tableaux sont incomparables, sinon la comparaison se fait valeur par valeur (voir l'exemple suivant) object N'importe quoi L'objet est toujours plus grand array N'importe quoi Le tableau est toujours plus grand
Comparaison Booléen/null ]]> Transcription des comparaisons standards des tableaux count($op2)) { return 1; // $op1 > $op2 } foreach ($op1 as $key => $val) { if (!array_key_exists($key, $op2)) { return 1; } elseif ($val < $op2[$key]) { return -1; } elseif ($val > $op2[$key]) { return 1; } } return 0; // $op1 == $op2 } ?> ]]> Comparaison de nombre à virgule flottante A cause de la façon dont les nombres à virgule flottante sont représentés en interne, vous ne devriez pas tester l'égalité entre deux nombres de type float. Voyez la documentation de float pour plus d'informations. Soyer conscient que la manipulation des types n'est pas toujours évidente lors de la comparaison de valeurs de différents types, en particulier comparant des &integer;s à des &boolean;s ou des &integer;s à des &string;s. Il est par conséquent généralement recommandé d'utiliser les opérateurs de comparaison === et !== au lieu de == et != dans la plupart des cas. Valeurs incomparables Tandis que les comparaisons d'identité (=== et !==) peuvent être appliqué à des valeurs arbitraires, les autres opérateurs de comparaisons devrait seulement être appliqué à des valeurs comparables. Le résultat de comparer des valeurs incomparables est indéfinie, et ne devrait pas être dépendu. &reftitle.seealso; strcasecmp strcmp opérateur de tableaux Types L'opérateur ternaire Un autre opérateur conditionnel est l'opérateur ternaire ("?:"). Affectation d'une valeur par défaut ]]> L'expression (expr1) ? (expr2) : (expr3) est évaluée à expr2 si expr1 est évaluée à &true;, et expr3 si expr1 est évaluée à &false;. Il est possible d'omettre la partie centrale de l'opérateur ternaire. L'expression expr1 ?: expr3 évalue le résultat de expr1 si expr1 vaut &true;, et expr3 sinon. expr1 n'est évalué qu'une seule fois dans ce cas. Notez que l'opérateur ternaire est une expression, et il n'est pas évalué en tant que variable, mais en tant que résultat de l'expression. Il est important de le savoir si vous voulez retourner une variable par référence. L'instruction return $var == 42 ? $a : $b; dans une fonction retournée par référence ne fonctionnera donc pas et une alerte est émise. Il est recommandé de ne pas "empiler" les expressions ternaires. Le comportement de PHP lors de l'utilisation de plusieurs opérateurs ternaire qui ne sont pas entre parenthèse en une unique expression est non évident comparé à d'autres langages. En effet antérieur à PHP 8.0.0, l'expression ternaire était évalué gauche-associatif, au lieu de droite-associatif comme la plupart des autres langages de programmations. Dépendre de la gauche associativité est obsolète à partir de PHP 7.4.0. À partir de PHP 8.0.0, l'opérateur ternaire est non associatif. Comportement de PHP ]]> La combinaison de ternaire court (?:), cependant, est stable et se comporte de manière résonable. Ceci évaluera au premier argument qui évalue à une valeur non-falsy. À noter que des valeurs indéfinies émettront toujours un avertissement. Combinaison de ternaire court ]]> Opérateur de fusion Null Un autre opérateur court utile est l'opérateur "??" (ou fusion null). Assigner une valeur par défaut ]]> L'expression (expr1) ?? (expr2) retourne expr2 si expr1 est &null;, et expr1 dans les autres cas. En particulier, cet opérateur n'émet pas de notice ou avertissement si la partie gauche n'existe pas, exactement comme isset. Ceci est particulièrement utile pour les clés des tableaux. Veuillez noter que l'opérateur null de fusion est une expression, et qu'il ne s'évalue pas comme une variable, mais comme le résultat d'une expression. Il est important de le savoir si vous souhaitez renvoyer une variable par référence. L'expression return $foo ?? $bar; est un retour par référence qui ne fonctionne donc pas et émet un avertissement. L'opérateur de fusion null à une précédence faible. Ceci signifie que le mélanger avec d'autres opérateurs (tel que la concaténation de chaînes ou les opérateurs arithmétiques) des parenthèses seront requis. ]]> Veuillez noter que l'opérateur de fusion null permet une imbrication simple: Imbrication de l'opération de fusion null ]]>
Opérateur de contrôle d'erreur PHP supporte un opérateur de contrôle d'erreur : l'arobase (@). Lorsque cet opérateur est ajouté en préfixe d'une expression PHP, les diagnostics d'erreurs qui peuvent être générés par cette expression seront ignorés. Si un gestionnaire d'erreur personnalisé est défini avec set_error_handler, il sera quand même appelé même si le diagnostic a été ignorée. Antérieur à PHP 8.0.0, le error_reporting appelée dans le gestionnaire d'erreur personnalisé retournait toujours 0 si le l'erreur a été ignorée avec l'opérateur @. À partir de 8.0.0, il retourne la valeur E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE. Tous les messages d'erreur générés par l'expression sont disponibles dans l'élément "message" du tableau retourné par la fonction error_get_last. Le résultat de la fonction changera à chaque erreur, aussi, il convient de le vérifier souvent. ]]> L'opérateur @ ne fonctionne qu'avec les expressions. La règle générale est : s'il est possible de prendre la valeur de quelque chose alors on peut préfixer l'opérateur @ à celui-ci. Par exemple, il peut être préfixé devant les variables, appels de fonctions, certains appels aux constructions de langages (e.g. include), etc. Il ne peut pas être préfixé devant les définitions de fonctions ou de classes ou structures conditionnelles telles que if et &foreach;, etc. Antérieur à PHP 8.0.0, il était possible pour l'opérateur @ de désactiver les erreurs critiques qui terminait l'exécution du script. Par exemple, préfixer @ à un appel d'une fonction qui n'existe pas, en étant indisponible ou mal orthographiée, causait le script à se terminer sans aucune indication pourquoi. &reftitle.seealso; error_reporting Gestion d'Erreur et fonction de Logging Opérateur d'exécution PHP supporte un opérateur d'exécution : guillemets obliques ("``"). Notez bien qu'il ne s'agit pas de guillemets simples. PHP essaie d'exécuter le contenu de ces guillemets obliques comme une commande shell. Le résultat sera retourné (c'est-à-dire : il ne sera pas simplement envoyé à la sortie standard, il peut être affecté à une variable). Utiliser les guillemets obliques revient à utiliser la fonction shell_exec. Opérateur d'exécution $output"; ?> ]]> Cet opérateur est désactivé lorsque la fonction shell_exec est désactivée. Contrairement à d'autres langages, les guillemets obliques n'ont pas de signification spéciale dans une chaîne entourée de guillemets doubles. &reftitle.seealso; Les fonctions d'exécution système popen proc_open Utiliser PHP depuis la ligne de commande Opérateurs d'incrémentation et décrémentation PHP supporte les opérateurs de pre- et post-incrémentation et décrémentation, comme en langage C. Les opérateurs d'incrémentation/décrémentation n'affectent que les nombres et les chaînes de caractères. Les tableaux, objets, booléen et ressources ne sont pas affectées. La décrémentation des valeurs &null; n'a également aucun effet, mais leur incrémentation donnera comme résultat 1. Opérateurs d'incrémentation et décrémentation Exemple Nom Résultat ++$a Pre-incrémente Incrémente $a de 1, puis retourne $a. $a++ Post-incrémente Retourne $a, puis incrémente $a de 1. --$a Pré-décrémente Décrémente $a de 1, puis retourne $a. $a-- Post-décrémente Retourne $a, puis décrémente $a de 1.
Voici un exemple simple : Post-incrémentation'; $a = 5; echo "Devrait valoir 5: " . $a++ . "
\n"; echo "Devrait valoir 6: " . $a . "
\n"; echo '

Pre-incrémentation

'; $a = 5; echo "Devrait valoir 6: " . ++$a . "
\n"; echo "Devrait valoir 6: " . $a . "
\n"; echo '

Post-décrémentation

'; $a = 5; echo "Devrait valoir 5: " . $a-- . "
\n"; echo "Devrait valoir 4: " . $a . "
\n"; echo '

Pre-décrémentation

'; $a = 5; echo "Devrait valoir 4: " . --$a . "
\n"; echo "Devrait valoir 4: " . $a . "
\n"; ?> ]]>
PHP suit les conventions de Perl pour la gestion des opérateurs arithmétiques sur les variables de caractères et non pas celle du C. Par exemple, en PHP et en Perl, $a = 'Z'; $a++; transforme $a en 'AA', alors qu'en C, a = 'Z'; a++; transforme a en '[' (la valeur ASCII de 'Z' est 90, la valeur ASCII de '[' est 91). Notez que les variables de caractères peuvent être incrémentés, mais pas décrémentées, mais aussi que seuls les caractères ASCII pleins et les chiffres (a-z, A-Z et 0-9) sont supportés. L'incrémentation/décrémentation d'autres variables de caractères n'a aucun effet, la chaîne originale n'est pas modifiée. Opérations arithmétiques sur un caractère ]]> &example.outputs; L'incrémentation ou la décrémentation d'un booléen n'a aucun effet.
Les opérateurs logiques Les opérateurs logiques Exemple Nom Résultat $a and $b And (Et) &true; si $a ET $b valent &true;. $a or $b Or (Ou) &true; si $a OU $b valent &true;. $a xor $b XOR &true; si $a OU $b est &true;, mais pas les deux en même temps. ! $a Not (Non) &true; si $a n'est pas &true;. $a && $b And (Et) &true; si $a ET $b sont &true;. $a || $b Or (Ou) &true; si $a OU $b est &true;.
La raison pour laquelle il existe deux types de "ET" et de "OU" est qu'ils ont des priorités différentes. Voir le paragraphe précédence d'opérateurs. Illustration des opérateurs logiques ]]> &example.outputs.similar;
Opérateurs de chaînes Il y a deux opérateurs de chaînes de caractères string. Le premier est l'opérateur de concaténation ('.'), qui retourne la concaténation de ses deux arguments. Le second est l'opérateur d'affectation concaténant (.=). Reportez-vous à opérateurs d'affectation pour plus de détails. Opérateur de concaténation ]]> &reftitle.seealso; Les types de chaînes de caractères Les fonctions de chaînes de caractères Opérateurs de tableaux Opérateurs de tableaux Exemple Nom Résultat $a + $b Union Union de $a et $b. $a == $b Égalité &true; si $a et $b contiennent les mêmes paires clés/valeurs. $a === $b Identique &true; si $a et $b contiennent les mêmes paires clés/valeurs dans le même ordre et du même type. $a != $b Inégalité &true; si $a n'est pas égal à $b. $a <> $b Inégalité &true; si $a n'est pas égal à $b. $a !== $b Non-identique &true; si $a n'est pas identique à $b.
L'opérateur + retourne le tableau de gauche auquel sont ajoutés les éléments du tableau de droite. Pour les clés présentes dans les 2 tableaux, les éléments du tableau de gauche seront utilisés alors que les éléments correspondants dans le tableau de droite seront ignorés. "pomme", "b" => "banane"); $b = array("a" =>"poire", "b" => "fraise", "c" => "cerise"); $c = $a + $b; // Union de $a et $b echo "Union de \$a et \$b : \n"; var_dump($c); $c = $b + $a; // Union de $b et $a echo "Union de \$b et \$a : \n"; var_dump($c); $a += $b; // Union de $a += $b est $a and $b echo "Union de \$a += \$b: \n"; var_dump($a); ?> ]]> À l'exécution, le script affichera : string(5) "pomme" ["b"]=> string(6) "banane" ["c"]=> string(6) "cerise" } Union de $b et $a : array(3) { ["a"]=> string(5) "poire" ["b"]=> string(6) "fraise" ["c"]=> string(6) "cerise" } Union de $a += $b: array(3) { ["a"]=> string(5) "pomme" ["b"]=> string(6) "banane" ["c"]=> string(6) "cerise" } ]]> Les éléments d'un tableau sont égaux en termes de comparaison s'ils ont la même clé et la même valeur. Comparer des tableaux "banane", "0" => "pomme"); var_dump($a == $b); // bool(true) var_dump($a === $b); // bool(false) ?> ]]> &reftitle.seealso; Le Type Tableau Les Fonctions de Tableaux
Opérateurs de types instanceof est utilisé pour déterminer si une variable PHP est un objet instancié d'une certaine classe : Utilisation de <literal>instanceof</literal> avec des classes ]]> &example.outputs; instanceof peut également être utilisé pour déterminer si une variable est un objet instancié d'une classe qui hérite d'une classe parente : Utilisation de <literal>instanceof</literal> avec des classes héritées ]]> &example.outputs; Pour vérifier si un objet n'est pas une instance d'une classe, l'opérateur logique not peut être utilisé. Utilisation de <literal>instanceof</literal> pour vérifier que l'objet <emphasis>n'est pas</emphasis> une instance de la classe ]]> &example.outputs; Et finalement, instanceof peut être utilisé pour déterminer si une variable est un objet instancié d'une classe qui implémente une interface : Utilisation de <literal>instanceof</literal> pour une interface ]]> &example.outputs; Bien que instanceof soit habituellement utilisé avec un nom de classe littéral, il peut également être utilisé avec un autre objet ou une chaîne représentant une variable : Utilisation de <literal>instanceof</literal> avec d'autres variables ]]> &example.outputs; instanceof ne lance aucune erreur si la variable testée n'est pas un objet, il retournera simplement &false;. Cependant, les constantes ne sont pas autorisées. Utilisation de <literal>instanceof</literal> pour tester d'autres variables ]]> &example.outputs; À partir de PHP 7.3.0, les constantes sont autorisées sur le côté gauche de l'opérateur instanceof. Utilisation de <literal>instanceof</literal> pour tester des constantes ]]> &example.outputs.73; À partir de PHP 8.0.0, instanceof peut désormais être utilisé avec des expressions arbitraires. L'expression doit être entre parenthèses et produire une string. Utilisation de <literal>instanceof</literal> avec une expression arbitraire ]]> &example.outputs.8; L'opérateur instanceof a une variante fonctionnelle avec la fonction is_a. &reftitle.seealso; get_class is_a