Синтаксис PHP удивляет условным оператором "?:" и "ИЛИ"
Сегодня у меня открылся рот от следующего:
$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 answers
Все дело в приоритете операторов и их ассоциативности
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"). Если вы не используете скобки, оператор после ИЛИ больше не имеет значения. Вы назначили первый элемент в качестве значения. Но если вы используете скобки, первым элементом будет оператор в скобках