operator - php double question mark
Sorpresa de la sintaxis de PHP con el operador condicional "?:" Y "O" (3)
$ asdf = (1 O true? "asdf": "fdsa");
Es igual a (1 OR (true ? "asdf" : "fdsa"));
Y es igual a (1 OR "asdf");
Y esto es igual a true
;
1 O "asdf" no es igual (1 O "asdf"). Si no usa corchetes, la declaración después del operador OR ya no es importante. Usted asignó el primer elemento como valor. Pero si usa paréntesis, el primer elemento será la instrucción entre paréntesis.
Hoy estuve boquiabierto por lo siguiente:
$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
Ok, el último no me sorprende mucho, pero el tercero? ¿Alguien puede explicar?
Aquí:
// use () - result in brackets assigned to $asdf
$asdf = (1 OR true ? "asdf" : "fdsa");
var_dump($asdf); // print true
Y aquí:
// = 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
Esto es todo sobre la precedencia del operador y su asociatividad.
http://php.net/manual/en/language.operators.precedence.php
or
tiene una precedencia más baja que =
por eso se ejecutará primero
entonces $asdf = 1 OR true ? "asdf" : "fdsa";
$asdf = 1 OR true ? "asdf" : "fdsa";
será algo como
($asdf = 1) or true ? :"asdf" : "fdsa"
($asdf = 1) or true ? :"asdf" : "fdsa"
es por eso que se imprimirá 1.
$a or $b
verifica si $ a o $ b es verdadero si $ a es verdadero, entonces se devuelve y ni siquiera se va a chequear $ b
En tercer caso
$asdf = (1 OR true ? "asdf" : "fdsa");
()
tiene mayor prioridad que =
por lo que se ejecutará antes de la asignación.
Probarlo
cambiar O a ||
que tiene mayor precedencia que =
$asdf = 1 || true ? "asdf" : "fdsa";
var_dump($asdf); // print asdf