<?php
$a = 1;
$b = 2;
$c = 3;
$d = 4;
$a = $b !== $c && $d = $b == $c;
var_dump($a,$d);exit;
這裡我理解的是:首先因為!==優先權高於&&,所以先判斷$b !== $c(為true)和$b == $c*(為false),然後進行&&判斷,而&&的話,是先執行左邊,再根據結果執行右邊吧,那麼左邊是$a = true,然後右邊是$d = false,但是為什麼打印$a是false呢,然後我理解這裡其實是:
$a = (true && ($d = false));
這我就不懂了,如果&&並不是指左邊的表達式,而是左邊的$b !== $c的值,那麼為什麼右邊就可以運行$d = false呢,到底這個結合是怎麼結合的呢...
查了很多資料,也問了幾個同事,他們都表示比較難解釋,日常開發不會用,但是我作為一個菜鳥,強迫症實在想弄明白,請大神們賜教如何去理解與判斷PHP的運算子優先順序與執行問題,因為其實開源程式碼裡這種寫法還是比較多的.
其實也類似$a = $b && $b = $c;
最後$a為true ,而$b卻是$c的值.(假設abc三個變數都是上面的1,2,3).
對於邏輯運算子可以這樣看,在每一個邏輯運算子的兩邊的表達式都將被組合成為一個整體.
組合2:對於
$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
.这里解释了可以执行右边的赋值表达式,而不执行左边的赋值表达式,因为左边的赋值表达式优先级低,在执行它之前,需要执行完
!==
, 再执行&&
,之后接着执行==
,再执行右边的=
,再执行左边的=
($b !== $c) && ($d = $b == $c)
組合1:($b !== $c)
($d = $b == $c)
🎜所以先執行組合1( $b !== $c)
,結果是true
,依短路運算,需要執行組合2($d = $b == $c)
,對於這個組合,裡面又由於==
運算子優先級高,執行==
,在賦值,也就是false
. 所以最終組合1的結果是true
,組合2的結果是false
,所以$a=false
. 🎜🎜這裡解釋了可以執行右邊的賦值表達式,而不執行左邊的賦值表達式,因為左邊的賦值表達式優先級低,在執行它之前,需要執行完!==
, 再執行&& code>,之後接著執行
==
,再執行右邊的=
,再執行左邊的=
🎜.🎜我來吐槽的. 你寫的
$a = $b !== $c && $d = $b == $c;
這一行我至今沒有仔細看,我是複製貼上的,哈哈,666..大兄弟:
1.這樣的程式碼是書本裡面的;
2.這樣的程式碼項目裡面很少存在,幾乎為0
3.即使有類似的需求,會用()來控制.以達到可讀型更強的目的
4.這樣的需求簡單理解下就行,使用性不強.