Сегодня меня открыли следующие слова:
$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
Хорошо, последнее меня не сильно удивляет, но третье?
Кто-нибудь может объяснить?
Это все о приоритете операторов и их ассоциативности
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");
()
имеет более высокий приоритет, чем =
поэтому он будет выполнен до назначения.
Чтобы доказать это
изменить ИЛИ на ||
который имеет более высокий приоритет, чем =
$asdf = 1 || true ? "asdf" : "fdsa";
var_dump($asdf); // print asdf
Вот:
// 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
$ asdf = (1 ИЛИ верно? «asdf»: «fdsa»);
Это равно (1 OR (true ? "asdf" : "fdsa"));
И это равно (1 OR "asdf");
И это равно true
;
1 ИЛИ «asdf» не равно (1 ИЛИ «asdf»). Если вы не используете скобки, оператор после оператора OR уже не важен. Вы назначили первый элемент в качестве значения. Но если вы используете скобки, первый элемент будет оператор в скобках