3 回答

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊
首先習(xí)慣性地,RTFM
沒有好不好,只有合適不合適
!
和empty()
行為有什么區(qū)別?
!
相當(dāng)于轉(zhuǎn)換為布爾值后取反,結(jié)果可以參照手冊的布爾值轉(zhuǎn)換部分empty
行為同樣見手冊
他們的行為有3個(gè)差異
空SimpleXML (經(jīng)過實(shí)驗(yàn),發(fā)現(xiàn)這是文檔問題,php5.1后,兩者行為是一致的)
未定義的變量 (
!$undefined
會產(chǎn)生error,empty($undefined)
則返回true) 和isset
類似,這個(gè)特性對于訪問復(fù)雜結(jié)構(gòu)的數(shù)組或?qū)ο蟪蓡T的時(shí)候特別友好(empty($arr['userModel']->userFriends)
)php5.5之前,
empty
只接受變量,不接受表達(dá)式(比如函數(shù)的返回結(jié)果empty(getSomething())
)
評論里也有人說了,因?yàn)閑mpty是語言結(jié)構(gòu),并沒有函數(shù)調(diào)用的巨大開銷,所以兩者的性能的差異不會太大,另外現(xiàn)代PHP對于這種小的開銷也已經(jīng)優(yōu)化地很好了,所以這里不怎么需要考慮性能。結(jié)合上面的分析來說,empty
是優(yōu)于!
的,除非你的php版本比較老,而又需要對表達(dá)式直接判斷,不希望多加一個(gè)變量
但是,如果你并不知道你手里的東西是不是數(shù)組,建議參考 @dreamans 的答案,考慮$arr
并非數(shù)組的場景做合適的處理。
因?yàn)?code>is_array并不具有empty
的耐受未定義的特性,我推薦這種寫法empty($arr) && is_array($arr)
能夠嚴(yán)謹(jǐn)?shù)刂С指鞣N場景
if(empty($undefined) && is_array($undefined));//未定義變量if(empty($arr['userModel']->userFriends) && is_array($arr['userModel']->userFriends));//(潛在)未定義成員//或者反向場景,判斷有內(nèi)容數(shù)組,結(jié)合表達(dá)式的能力if(!empty($things = getSomething()) && is_array($things));
當(dāng)然,更好的風(fēng)格是用typehinting代替is_array
,一定是array且一定定義過,情況好得多
關(guān)于官方手冊中empty行為描述的不完整,已經(jīng)補(bǔ)充評論了,各位有空幫忙upvote

TA貢獻(xiàn)1874條經(jīng)驗(yàn) 獲得超12個(gè)贊
寫代碼要嚴(yán)謹(jǐn):
if(is_array($arr) && !$arr) { do something }
添加回答
舉報(bào)