PHP 语法惊喜与条件运算符 “?:” 和 “OR”

今天,我被以下几点张开了嘴巴:

$asdf = ((1 OR true) ? "asdf" : "fdsa");
var_dump($asdf); // print "asdf"

$asdf = (1 OR true) ? "asdf" : "fdsa";
var_dump($asdf); // print "asdf"

$asdf = (1 OR true ? "asdf" : "fdsa");
var_dump($asdf); // print true

$asdf = 1 OR true ? "asdf" : "fdsa";
var_dump($asdf); // print 1

好吧,最后一个不会让我感到惊讶,但是第三个呢?谁能解释一下?


答案 1

这完全是关于运算符优先级及其关联性

http://php.net/manual/en/language.operators.precedence.php

or具有比这更低的优先级,这就是为什么它将首先执行的原因=

所以$asdf = 1 OR true ? "asdf" : "fdsa";

会像这样

($asdf = 1) or true ? :"asdf" : "fdsa"这就是为什么它会打印1。

$a or $b检查$a或$b是否为真,如果$a为真,则返回它,甚至不去检查$b

在第三种情况下

$asdf = (1 OR true ? "asdf" : "fdsa");

()具有更高的优先级,因此它将在分配之前执行。=

证明这一点

更改 OR 具有高于其优先级的 OR||=

$asdf = 1 || true ? "asdf" : "fdsa";

var_dump($asdf); // print asdf

答案 2

这里:

// use () - result in brackets assigned to $asdf
$asdf = (1 OR true ? "asdf" : "fdsa");
var_dump($asdf); // print true

这里:

// = has higher precedence so $asfd equals 1 
// and it doesn't matter what is the result of ternary operator
$asdf = 1 OR true ? "asdf" : "fdsa";
// line equals to 
($asdf = 1) OR (true ? "asdf" : "fdsa");
// so $asdf is always 1 here
var_dump($asdf); // print 1

推荐