2012-04-08 6 views
6

Soy un poco fanático de la optimización (al menos según mi definición) y esta pregunta me ha estado molestando bastante tiempo.PHP || y && optimización lógica

Me pregunto si PHP hace una optimización en los & & y ||: Tomemos el siguiente ejemplo:

$a = "apple"; 
$b = "orange"; 
if ($a == "orange" && $b == "orange") { 
    //do stuff 
} 

Cuando ese código se ejecuta, se comprobará si $ a es igual a "naranja. " En este caso, no lo es. Sin embargo, hay un operador & &. Dado que la primera parte ($ a == "naranja") ya devolvió false, ¿comprobará PHP si $ b es igual a "naranja"?

que tienen la misma pregunta para ||:

$a = "orange"; 
$b = "orange"; 
if ($a == "orange" || $b == "orange") { 
    //do stuff 
} 

Cuando se comprueba si $ a es igual a "naranja", que devuelve verdadero. Ya que eso haría que || operador return true, PHP incluso comprobará la segunda parte de || (ya que sabemos que será cierto)?

Espero que tenga sentido aquí, y espero que alguien tenga una respuesta para mí. ¡Gracias!

+0

Eso es lo que siempre he asumido. Y, en la práctica, el operador AND funciona de esa manera. Por ejemplo, podría hacer 'if (isset ($ a) && $ una instancia de SomeClass && $ a-> someMethod() == 'orange')' y tiene que pasar cada paso del condicional para probar el siguiente. Pero no tengo nada que me respalde excepto el hecho de que simplemente sé que funciona. –

+2

¿Por qué no intentarlo?'if (true || die()) {echo '1';}' y 'if (true && die()) {echo '1';}' –

Respuesta

6

PHP utiliza short circuit evaluation con condicionales binarios (tales como &&, || o sus equivalentes constantes), así que si el resultado de evaluar la LHS significa el RHS no es necesario, no lo hará.

Por ejemplo ...

method_exists($obj, 'func') AND $obj->func(); 

... es una explotación de este hecho. El RHS solo se evaluará si el LHS devuelve un valor de verdad en este ejemplo. La lógica tiene sentido aquí, ya que solo quieres llamar a un método si existe (siempre y cuando no estés usando __call(), pero esa es otra historia).

También puede usar OR de forma similar.

defined('BASE_PATH') OR die('Restricted access to this file.'); 

Este patrón se utiliza a menudo como la primera línea de los archivos PHP que deben incluirse y no accederse directamente. Si la constante BASE_PATH no existe, el LHS es falsy para que ejecute el RHS, que die() es el script.

+0

¿Podría quizás reformular eso en términos sencillos? Jaja. Haré una búsqueda rápida en Google con esas palabras. – fruitcup

+0

@DrAgonmoray después de la primera condición, PHP solo evaluará las condiciones adicionales si es necesario :) – rawb

+0

@rawb Gracias. :) – fruitcup

1

Sí, PHP cortocircuita los operadores && y ||, lo que significa que no, el operando correcto no se evaluará si el valor del operando izquierdo significa que no es necesario evaluarlo. No hay necesidad de optimizarlos. Puede probarlo de esta forma:

function one() { 
    echo "One"; 
    return false; 
} 

function two() { 
    echo "Two"; 
    return true; 
} 

one() && two(); // Outputs One 
echo "\n"; 
two() || one(); // Outputs Two 

Here's a demo. Si no hubiera un cortocircuito, se obtendría:

OneTwo 
TwoOne 
Cuestiones relacionadas