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
今天,我被以下内容惊呆了:
$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