Неожиданность синтаксиса PHP с условным оператором & quot;?: & Quot; и «ИЛИ»

Сегодня меня открыли следующие слова:

$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

Хорошо, последнее меня не сильно удивляет, но третье?
Кто-нибудь может объяснить?

17

Решение

Это все о приоритете операторов и их ассоциативности

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
15

Другие решения

Вот:

// 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
3

$ asdf = (1 ИЛИ верно? «asdf»: «fdsa»);

Это равно (1 OR (true ? "asdf" : "fdsa"));

И это равно (1 OR "asdf");

И это равно true;

1 ИЛИ «asdf» не равно (1 ИЛИ «asdf»). Если вы не используете скобки, оператор после оператора OR уже не важен. Вы назначили первый элемент в качестве значения. Но если вы используете скобки, первый элемент будет оператор в скобках

2
По вопросам рекламы [email protected]