<?php
$une = 1 ;
$b = 2 ;
$c = 3 ;
$d = 4 ;
$a = $b !== $c && $d = $b == $c;
var_dump($a,$d);exit;
Ce que je comprends ici est : Premièrement, parce que !== a une priorité plus élevée que &&, il est d'abord jugé si $b !== $c (est vrai) et $b == $c* (est faux) , puis exécute && Jugement, et pour &&, exécutez d'abord le côté gauche, puis exécutez le côté droit en fonction du résultat. Ensuite, le côté gauche est $a = true, puis le côté droit est $d = false, mais. pourquoi l'impression de $a est-elle fausse ? Alors je comprends que c'est en fait :
$a = (true && ($d = false));
Je ne comprends pas cela. Si && ne fait pas référence à l'expression à gauche, mais à la valeur de $b !== $c à gauche, alors pourquoi $d = false peut-il être exécuté à droite ? Quelle est cette combinaison ? Comment la combiner...
J'ai vérifié beaucoup d'informations et demandé à plusieurs collègues. Ils ont tous dit que c'était difficile à expliquer et ne pouvait pas être utilisé dans le développement quotidien. trouble compulsif, je veux vraiment le comprendre. Quelqu'un peut-il m'aider ? S'il vous plaît, donnez-moi quelques conseils sur la façon de comprendre et de juger les problèmes de priorité des opérateurs et d'exécution de PHP, car en fait, il existe encore de nombreuses méthodes d'écriture de ce type en open source. code.
En fait, c'est similaire à $a = $b && $b = $ c;
Enfin, $a est vrai, mais $b est la valeur de $c. les trois variables abc sont toutes 1, 2 et 3 ci-dessus).
Pour les opérateurs logiques, vous pouvez le voir de cette façon. Les expressions des deux côtés de chaque opérateur logique seront combinées en un toutPour
Donc, exécutez la combinaison 1$b !== $c && $d = $b =. = $c
, pour cette expression, deux combinaisons seront générées :($b !== $c) && ($d = $b == $c)
$b !== $c && $d = $b == $c
,对于这个表达式,将会生成两个组合:($b !== $c) && ($d = $b == $c)
组合1:
($b !== $c)
组合2:
($d = $b == $c)
所以先执行组合1
($b !== $c)
,结果是true
,根据短路运算,需要执行组合2($d = $b == $c)
,对于这个组合,里面又由于==
运算符优先级高,执行==
,在赋值,也就是false
. 所以最终组合1的结果是true
,组合2的结果是false
,所以$a=false
.这里解释了可以执行右边的赋值表达式,而不执行左边的赋值表达式,因为左边的赋值表达式优先级低,在执行它之前,需要执行完
!==
, 再执行&&
,之后接着执行==
,再执行右边的=
,再执行左边的=
combination 1 :($b !== $c)
Combinaison 2 :($d = $b == $c)
( premier $ b !== $c)
, le résultat esttrue
, selon l'opération de court-circuit, combinaison 2($d = $b == $c) code> doit être exécuté, pour cette combinaison, car l'opérateur
==
a une priorité élevée,==
est exécuté avant l'affectation, ce qui estfalse code>. Donc au final, le résultat de la combinaison 1 est
true
, et le résultat de la combinaison 2 estfalse
, donc$a=false
. 🎜🎜Ici, il est expliqué que le côté droit peut être exécuté. Expression d'affectation au lieu d'exécuter l'expression d'affectation à gauche, car l'expression d'affectation à gauche a une faible priorité avant de l'exécuter,!==code> doit être exécuté, puis
&& code>, puis exécutez
==
, puis exécutez=
à droite, puis exécutez=
à gauche🎜.🎜Je suis là pour me plaindre. Je n'ai pas regardé attentivement cette ligne que tu as écrite
$a = $b !== $c && $d = $b == $c;
, je l'ai copiée et collée, haha, 666..Grand frère :
1. Un tel code est dans les livres ;
2. De tels projets de code existent rarement, presque 0
3 Même s'il existe des exigences similaires, () sera utilisé pour le contrôler afin d'obtenir la lisibilité. modèle plus fort
4. Une telle exigence peut être simplement comprise, mais la convivialité n'est pas forte.