這篇文章主要介紹了關於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中文網其他相關文章!

負載均衡會影響會話管理,但可以通過會話複製、會話粘性和集中式會話存儲解決。 1.會話複製在服務器間複製會話數據。 2.會話粘性將用戶請求定向到同一服務器。 3.集中式會話存儲使用獨立服務器如Redis存儲會話數據,確保數據共享。

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

PHP會話的替代方案包括Cookies、Token-basedAuthentication、Database-basedSessions和Redis/Memcached。 1.Cookies通過在客戶端存儲數據來管理會話,簡單但安全性低。 2.Token-basedAuthentication使用令牌驗證用戶,安全性高但需額外邏輯。 3.Database-basedSessions將數據存儲在數據庫中,擴展性好但可能影響性能。 4.Redis/Memcached使用分佈式緩存提高性能和擴展性,但需額外配

Sessionhijacking是指攻擊者通過獲取用戶的sessionID來冒充用戶。防範方法包括:1)使用HTTPS加密通信;2)驗證sessionID的來源;3)使用安全的sessionID生成算法;4)定期更新sessionID。

本文比較了PHP和ASP.NET,重點是它們對大規模Web應用程序,性能差異和安全功能的適用性。兩者對於大型項目都是可行的,但是PHP是開源和無關的,而ASP.NET,


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Linux新版
SublimeText3 Linux最新版

Atom編輯器mac版下載
最受歡迎的的開源編輯器

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具