Синтаксис 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

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

Author: Pang, 2015-08-14

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
 15
Author: Robert, 2015-08-14 07:49:04

Здесь:

// 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
Author: u_mulder, 2015-08-14 07:52:03

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

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

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

И это равно true;

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

 2
Author: vural, 2015-08-14 08:11:18