javascript - PHP什麼情況下可以寫: $a = $a or $b;

來源:互聯網
上載者:User
因為js經常有這樣的寫法,但是我在php下試了卻不行, $anullfalse-1時都無效。
現在用的比較囉嗦的寫法:

$a = $a?$a:$b;$a = is_*($a)?$a:$b;

但是如何滿足這樣的寫法:

$a = $a or $b;

回複內容:

因為js經常有這樣的寫法,但是我在php下試了卻不行,$anullfalse-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開始有了??操作符就是做這個事情的.

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.