Maison > Article > développement back-end > À propos d'un problème rencontré par l'opérateur conditionnel PHP et de sa solution
Cet article présente principalement un problème et une solution rencontrés avec les opérateurs conditionnels PHP. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer
Je l'ai rencontré aujourd'hui. question sur l'utilisation imbriquée d'opérateurs conditionnels (expressions ternaires) en PHP
Regardons d'abord un morceau de code en langage C (test.c ) :
#include<stdio.h> int main() { int x = 1; int shit = x == 1 ? 100 : x == 2 ? 200 : 300; printf("shit的值:%d\n", shit); return 0; }</stdio.h>
Compilez et exécutez
root$ gcc test.c -o test && ./test shit的值:100
La réponse est comme prévu, car x==1, donc 100 est attribué à de la merde.
Mais si on réécrit le code ci-dessus en PHP (test.php) :
<?php $x = 1; $shit = $x == 1 ? 100 : $x == 2 ? 200 : 300; echo "shit的值:$shit\n";
Exécutez-le :
root$ php test.php shit的值:200
Nous avons trouvé que les résultats renvoyés sont différents. Pourquoi?
Tout d'abord, je soupçonne qu'il peut s'agir d'un problème prioritaire avec l'opérateur de comparaison(==) et l'opérateur conditionnel (?:) en PHP, vérifions la documentation officielle PHP
== a une priorité plus élevée que ?: (langage C C'est aussi le cas), donc
$shit = $x == 1 ? 100 : $x == 2 ? 200 : 300;
équivaut à
$shit = ($x == 1) ? 100 : ($x == 2) ? 200 : 300;
C'est en effet vrai lorsqu'il est exécuté une fois. le problème peut être exclu.
Mais dans le document officiel, il y a cette phrase dans l'exemple du sens de combinaison d'opérateurs :
C'est très similaire au phénomène décrit ci-dessus. Le problème devrait être là. Après quelques recherches, j'arrive à la conclusion suivante :
Le sens de combinaison de l'opérateur conditionnel (?:) en langage C est de droite à left, chaque évaluation commence à partir de la sous-expression la plus à droite, donc
int x = 1; int shit = x == 1 ? 100 : x == 2 ? 200 : 300; //等效于 int shit = x == 1 ? 100 : (x == 2 ? 200 : 300); //等效于 int shit = x == 1 ? 100 : (300);// 100
L'opérateur conditionnel de PHP (?:) La direction de la combinaison est de de gauche à droite , et chaque évaluation commence à partir de la sous-expression la plus à gauche, donc
$x = 1; $shit = $x == 1 ? 100 : $x == 2 ? 200 : 300; //等效于 $shit = ($x == 1 ? 100 : $x == 2) ? 200 : 300; //等效于 $shit = (100) ? 200 : 300;// 200
En raison de la direction de combinaison des opérateurs conditionnels de PHP, nous ne pouvons pas obtenir l'effet d'expressions if-elseif-elseif-else en imbriquant des opérateurs conditionnels comme C/C++, sauf si nous utilisons les sous-expressions suivantes. L'ajout de parenthèses dans cet exemple peut être résolu de cette manière :
$shit = $x == 1 ? 100 : ($x == 2 ? 200 : 300);
Mais lorsqu'il y a beaucoup de branches conditionnelles, des problèmes de lisibilité du code surviendront (parenthèses empilées) :
$shit = $x == 1 ? 100 : ($x == 2 ? 200 : ($x== 3 ? 300 : ... ($x == 8 ? 800 : 900)))))));
Puisque la méthode d'écriture de PHP sans parenthèses empilées est incohérente avec C/C++ en termes de résultats d'exécution, et la liaison par défaut la direction ne peut être modifiée qu'en ajoutant des crochets pour obtenir les résultats attendus, cela n'est tout simplement pas recommandé dans la documentation PHP. Opérateurs conditionnels imbriqués :
Remarque :
Il est recommandé d'éviter "d'empiler" les expressions ternaires. . Le
comportement de PHP lors de l'utilisation de plus d'un opérateur ternaire dans une seule instruction n'est pas évident
Ce qui précède est l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de tout le monde. contenu, veuillez faire attention au site Web PHP chinois !
Recommandations associées :
Comment résoudre le problème élevé de PHP Problèmes de concurrence et de trafic important
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!