關於PHP條件運算子遇到的一個問題及解決方法

不言
發布: 2023-04-03 07:56:01
原創
1540 人瀏覽過

這篇文章主要介紹了關於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;
登入後複製

執行一遍也確實如此,可以排除掉是運算子優先級導致問題的可能性了。

但是官方文件裡關於運算子結合方向的舉例說明中出現了這麼一句話:

關於PHP條件運算子遇到的一個問題及解決方法這跟上文描述的現像很相似,問題應該就在這裡了。一番查閱之後得到以下結論:

結論

  • 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板