2010-03-29 10 views
28

Tengo esta declaración if que prueba las 2 condiciones siguientes. La segunda es una función goodToGo() por lo que quiero llamarlo a menos que la primera condición ya es una realidadhace que la condición después de && siempre se evalúe

$value = 2239; 

if ($value < 2000 && goodToGo($value)){ 
    //do stuff 
} 

function goodToGo($value){ 
    $ret = //some processing of the value 
    return $ret; 
} 

Mi pregunta es acerca de la 2 si las condiciones $value < 2000goodToGo($value)&&. ¿Los dos se evalúan o el segundo solo se evalúa cuando el primero es verdadero?

En otras palabras, ¿son los 2 bloques siguientes lo mismo?

if($value < 2000 && goodToGo($value)) { 
    //stuff to do 
} 

if($value < 2000) { 
    if (goodToGo($value)){ 
     //stuff to do 
    } 
} 
+3

¿Es muy difícil de verificar? –

+0

@Col, gracias por la ayuda. ¿Cómo? – brett

+0

¿Han imprimido las funciones? if (test1() && test2()) ... –

Respuesta

60

No, la segunda condición no siempre se ejecutará (lo que hace que sus ejemplos sean equivalentes).

de PHP &&, ||, and y or operadores se implementan como operadores "cortocircuito". Tan pronto como se encuentra una condición que fuerza el resultado para el condicional general, se detiene la evaluación de las condiciones posteriores.

De http://www.php.net/manual/en/language.operators.logical.php

// -------------------- 
// foo() will never get called as those operators are short-circuit 

$a = (false && foo()); 
$b = (true || foo()); 
$c = (false and foo()); 
$d = (true or foo()); 
+0

Elegí esta respuesta posterior porque saca a colación un punto realmente bueno sobre '(true || foo()) '. Hubiera pensado que el segundo evaluaría ya que el primero es "verdadero", pero parece que no es el caso. Bueno saber. – brett

+1

@brett, Sí, la clave es que para O, usted sabe que va a ser VERDADERO la primera vez que encuentre un VERDADERO, ningún número de FALSOS cambiará eso. Para Y, sabes que será FALSO la primera vez que encuentres un FALSO, ningún número de VERDADES cambiará eso. – sblom

+0

explicación tiene sentido. – JayKandari

5

Sí. Los dos bloques son iguales. PHP, como la mayoría de los lenguajes (pero no todos), usa evaluación de cortocircuito para && y ||.

1

Sí, los 2 bloques de código que dio son equivalentes. PHP tiene cortocircuitos, entonces cuando usas || y & &, cualquier declaración después de la primera solo se evalúa cuando sea necesario.

2

la segunda condición sólo se comprobará si y sólo si primero es cierto, por lo tanto, ambas declaraciones son equivalentes.

3

Los dos bloques SON iguales.

Los operadores lógicos PHP son "flojos", se evalúan solo si son necesarios. Los siguientes código imprime "Hola, mundo!":

<?php 
$a = 10; 
isset($a) || die ("variable \$a does not exist."); 
print "Hello, world!" 
?> 

otros operadores lógicos incluye & &, y o.

<?php 
perform_action() or die ('failed to perform the action'); 
?> 

es una expresión popular.

0

Siempre corelate su lenguaje técnico con su propio idioma, del mismo modo aquí, si te digo en una conversación verbal, es como: Estás preguntando = "si tengo hambre '& &' Estoy comiendo pizza" es similar a "Si tengo hambre, ¿solo estoy comiendo pizza"? Así que aquí puedes ver que la frase posterior dice que hasta que no tenga hambre no estoy comiendo pizza, y la primera dice que soy humilde y que estoy comiendo pizza. :-)

+1

Ahora me siento hambriento :) Pero no como pizza –

Cuestiones relacionadas