Maison  >  Article  >  développement back-end  >  À propos d'un problème rencontré par l'opérateur conditionnel PHP et de sa solution

À propos d'un problème rencontré par l'opérateur conditionnel PHP et de sa solution

不言
不言original
2018-07-14 13:54:211508parcourir

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

phénomène

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?

Dépannage

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 :

À propos dun problème rencontré par lopérateur conditionnel PHP et de sa solutionC'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 :

Conclusion

  • 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 :

Parlons de l'injection de dépendances, des conteneurs et des modèles d'apparence dans le développement de framework (Partie 2)

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn