今天,我口口相传:
$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
好的,最后一次并不让我感到惊讶,但第三次? 谁能解释一下?
答案 0 :(得分:15)
这完全是关于运算符优先级及其关联性
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
答案 1 :(得分:3)
下面:
// 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
答案 2 :(得分:2)
$ asdf =(1 OR true?“asdf”:“fdsa”);
等于(1 OR (true ? "asdf" : "fdsa"));
它等于(1 OR "asdf");
这等于true
;
1或“asdf”不相等(1或“asdf”)。如果不使用括号,则OR运算符后的语句不再重要。您将第一个元素指定为值。但是如果你使用括号,第一个元素将是括号中的语句