question operator mark php syntax operators ternary-operator conditional-operator

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