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

PHP syntax surprise with conditional operator "?:" and "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

好吧,最后一个并不让我吃惊,但是第三个呢? 谁能解释一下?

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

等于(1 OR (true ? "asdf" : "fdsa"));

等于(1 OR "asdf");

这等于true

1 OR "asdf" 不等于 (1 OR "asdf")。如果不使用括号,则 OR 运算符之后的语句就不再重要了。您将第一个元素指定为值。但是如果你使用括号,第一个元素将是括号中的语句

这里:

// 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

这是关于运算符优先级及其结合性的全部内容

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 更改为 ||,其优先级高于 =

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

var_dump($asdf); // print asdf