使用条件运算符的PHP语法惊喜"?:"和"或"

时间:2015-08-14 07:30:13

标签: php syntax operators ternary-operator conditional-operator

今天,我口口相传:

$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

好的,最后一次并不让我感到惊讶,但第三次? 谁能解释一下?

3 个答案:

答案 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运算符后的语句不再重要。您将第一个元素指定为值。但是如果你使用括号,第一个元素将是括号中的语句