operator operadores else aritmeticos php if-statement short-circuiting

operadores - ¿Tiene PHP una evaluación de cortocircuito?



php if else (8)

Creé mi propia lógica de evaluación de cortocircuitos, desafortunadamente no tiene nada que ver con la sintaxis rápida de javascripts, pero quizás esta sea una solución que podría serle útil:

$short_circuit_isset = function($var, $default_value = NULL) { return (isset($var)) ? : $default_value; }; $return_title = $short_circuit_isset( $_GET[''returntitle''], ''God''); // Should return type ''String'' value ''God'', if get param is not set

No recuerdo de dónde saqué la siguiente lógica, pero si haces lo siguiente;

(isset($var)) ? : $default_value;

Puede omitir tener que escribir la variable de condición verdadera nuevamente, después del signo de interrogación, por ejemplo:

(isset($super_long_var_name)) ? $super_long_var_name : $default_value;

Como observación muy importante , al usar el operador Ternary de esta manera, notará que si se hace una comparación, simplemente pasará el valor de esa comparación, ya que no hay una sola variable. P.ej:

$num = 1; $num2 = 2; var_dump( ($num < $num2) ? : ''oh snap'' ); // outputs bool ''true''

Dado el siguiente código:

if (is_valid($string) && up_to_length($string) && file_exists($file)) { ...... }

Si is_valid($string) devuelve false, ¿el intérprete php sigue verificando condiciones posteriores como up_to_length($string) ? Si es así, ¿por qué funciona extra cuando no es necesario?


En resumen, por lo tanto:

Los operadores bit a bit son & y |
Ellos siempre evalúan ambos operandos.

Los operadores lógicos son AND, OR, && y ||
AND y O siempre evalúan ambos operandos.

&& y || solo evalúa el lado derecho si es necesario.


Mi elección: no confíe en la evaluación de cortocircuito en PHP ...

function saySomething() { print (''hi!''); return true; } if (1 || saySomething()) { print(''statement evaluated to true''); }

La segunda parte en la condición 1 || saySomething () es irrelevante, porque esto siempre volverá verdadero. Lamentablemente saySomething () se evalúa y ejecuta.

Tal vez me malinterpreten la lógica exacta de las expresiones de cortocircuito, pero no parece que "hará el número mínimo de comparaciones posibles" para mí.

Además, no es solo una cuestión de rendimiento, si haces asignaciones dentro de las comparaciones o si haces algo que hace la diferencia, aparte de simplemente comparar cosas, podrías terminar con diferentes resultados.

De todos modos ... ten cuidado.


No, no. Este es siempre un buen lugar para optimizar el orden de las condiciones.


No, ya no verifica las otras condiciones si la primera condición no se cumple.


Sí, el intérprete de PHP es "flojo", lo que significa que hará el número mínimo de comparaciones posibles para evaluar las condiciones.

Si quieres verificar eso, prueba esto:

function saySomething() { echo ''hi!''; return true; } if (false && saySomething()) { echo ''statement evaluated to true''; }


Sí, lo hace. Aquí hay un pequeño truco que se basa en la evaluación de cortocircuito. A veces puede tener una pequeña afirmación de que preferiría escribir como un ternario, por ejemplo:

if ($confirmed) { $answer = ''Yes''; } else { $answer = ''No''; }

Se puede volver a escribir como:

$answer = $confirmed ? ''Yes'' : ''No'';

Pero, ¿qué pasaría si el bloque sí también requiriera que se ejecutara alguna función?

if ($confirmed) { do_something(); $answer = ''Yes''; } else { $answer = ''No''; }

Bueno, la reescritura como ternario todavía es posible, debido a la evaluación de cortocircuito:

$answer = $confirmed && (do_something() || true) ? ''Yes'' : ''No'';

En este caso, la expresión (do_something () || true) no altera el resultado general del ternario, pero asegura que do_something () solo se ejecute si $ confirm es verdadero.


Nota al margen: si desea evitar la verificación perezosa y ejecutar cada parte de la condición, en ese caso debe usar el AND lógico así:

if (condition1 & condition2) { echo "both true"; } else { echo "one or both false"; }

Esto es útil cuando necesita, por ejemplo, llamar a dos funciones, incluso si la primera devuelve falso.