因為js經常有這樣的寫法,但是我在php下試了卻不行,
$a為
null,
false,
-1時都無效。
現在用的比較囉嗦的寫法:
$a = $a?$a:$b;$a = is_*($a)?$a:$b;
但是如何滿足這樣的寫法:
$a = $a or $b;
回複內容:
因為js經常有這樣的寫法,但是我在php下試了卻不行,$a為null,false,-1時都無效。
現在用的比較囉嗦的寫法:
$a = $a?$a:$b;$a = is_*($a)?$a:$b;
但是如何滿足這樣的寫法:
$a = $a or $b;
PHP是不支援$a = $a || $b;這種賦值寫法的,這樣寫返回的是一個或運算的布爾值。(優先順序請閱讀 @qinjianxiang 同學的答案 )
但是,對於PHP本身提供的三元運算(expr1) ? (expr2) : (expr3)從PHP5.3開始已經可以省略expr2,因此你可以簡寫成下面這樣:
$a = $a ?: $b;
簡潔程度應該跟JS裡面的a = a || b差不多吧? 但是要注意:PHP中 0、null、''(Null 字元串)都是==false的。
又回到了一年一度,一月一次不得不提及的PHP運算子優先順序問題了!回答這個問題之前,不得不把我之前回答的一個問題連結給題主看看:PHP陷阱?
看了上面的連結你可能就會明白,實際上呢你寫的這句話在PHP中根本不會完成你想要的效果,如果你還不明白的話我給你加上括弧吧:
($a = $a) or $b;
怎麼樣看懂了吧,從左往右讀,賦值的操作比或操作優先執行,最後這句話被解析成了一個或操作,然後左邊是一個將本身賦值給本身的操作,必然為true所以你會發現$a的值永遠是不會變的。
最後是一句題外話,PHP目前我的認識裡頭好像沒辦法寫成這種形式應該,如果有的話請告知我,謝謝!
PHP裡的 || 和 or 操作符傳回值都是布爾值,所以,不可能實現像Javascript和Perl裡那樣的a = a || b的效果了。
最接近最簡潔的寫法便是?:操作符:
$a = $a ? $a : $b;
那麼$a = $a or $b到底返回什麼呢?且看一段測試代碼:
它將輸出:
bool(false)
int(0)
為什麼輸出不一樣?因為 || 和 or 兩個操作符的優先順序不一樣:
||優先順序比=高,所以,$a = $a || $b,等同於$a = ($a || $b),是先拿$a, $b求或,得到一個boolean,再把這個boolean賦值給$a
or優先順序比=低,所以,$a = $a or $b,等同於($a = $a) or $b,先執行$a = $a,再把$a的值和$b執行or操作,但操作結果不賦值給任何變數,所以你觀察不到$a的值被改變
PHP操作符優先順序:http://www.php.net/manual/en/language.operators.precedence.php
挖墳的問題了,一直忘了結貼,現在自問自答,就當給sf做個seo吧.
樓上說的都對,現在PHP7開始有了??操作符就是做這個事情的.