這篇文章主要介紹了關於PHP條件運算子遇到的一個問題及解決方法,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
今天遇到一個關於PHP 巢狀使用條件運算子(ternary expressions)的問題
先來看一段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>
編譯後執行一下
root$ gcc test.c -o test && ./test shit的值:100
答案在意料之中,因為x==1,所以100被賦值給shit。
但是如果我們用PHP重寫上文的程式碼(test.php):
<?php $x = 1; $shit = $x == 1 ? 100 : $x == 2 ? 200 : 300; echo "shit的值:$shit\n";
執行一下:
root$ php test.php shit的值:200
我們發現返回的結果不一樣了,這是為什麼呢?
首先懷疑可能是PHP中比較運算子(==)和條件運算子(?:)的優先權問題,我們查看PHP官方文件
==的優先權比?:更高(C語言也是這樣),所以
$shit = $x == 1 ? 100 : $x == 2 ? 200 : 300;
等效於
$shit = ($x == 1) ? 100 : ($x == 2) ? 200 : 300;
執行一遍也確實如此,可以排除掉是運算子優先級導致問題的可能性了。
但是官方文件裡關於運算子結合方向的舉例說明中出現了這麼一句話:
這跟上文描述的現像很相似,問題應該就在這裡了。一番查閱之後得到以下結論:
C語言的條件運算子(?:)的結合方向是從右往左,每次求值都是從最右邊的子表達式開始算起,所以
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
PHP的條件運算子(?:)的結合方向是從左往右,每次求值都是從最左邊的子表達式開始算起,所以
$x = 1; $shit = $x == 1 ? 100 : $x == 2 ? 200 : 300; //等效于 $shit = ($x == 1 ? 100 : $x == 2) ? 200 : 300; //等效于 $shit = (100) ? 200 : 300;// 200
介於PHP的條件運算子結合方向,我們無法像C/C 那樣透過嵌套條件運算子來達到if-elseif-elseif-else表達式的效果,除非我們在後面的子表達式中加上括號,本例中就可以靠這種方式解決:
$shit = $x == 1 ? 100 : ($x == 2 ? 200 : 300);但在條件分支較多的情況下,就會出現代碼可讀性問題(堆積括號):
$shit = $x == 1 ? 100 : ($x == 2 ? 200 : ($x== 3 ? 300 : ... ($x == 8 ? 800 : 900)))))));由於PHP不堆積括號的寫法與C/C 在執行結果上是不一致的,並且只能透過加括號改變預設的結合方向以達到預期的結果,所以PHP文檔裡乾脆不建議嵌套使用條件運算子:Note:
It is recommended that you avoid "stacking" ternary expressions. PHP's
behaviour when using more than one ternary operator within a single statement is non-obvious
#以上就是以上是以上就是本文的全部內容,希望對大家的學習有幫助,更多相關內容請關注PHP中文網!
相關推薦:
聊聊框架開發的依賴注入,容器與外觀模式(下部)如何解決PHP的高並發和大流量的問題以上是關於PHP條件運算子遇到的一個問題及解決方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!