2011-03-29 15 views
5

Los siguientes dos if s produjeron resultados diferentes (primero if echos hola, segundo no), ¿por qué? ¿Por qué no funcionó la asignación de variable en $t? ¿Esto se debe al alcance local de $t dentro del condicional if?asignación de variable php dentro si condicional

if(isset($_REQUEST["test"]) && $t=trim($_REQUEST["test"]) && !empty($t)){ 
    echo 'hi' 
} 

if(isset($_REQUEST["test"]) && $t=trim($_REQUEST["test"])){ 
    if(!empty($t))echo 'hi' 
} 
+0

[duplicado] (http://stackoverflow.com/questions/5091986/unexpected-cast-to-boolean/5092026#5092026)? – meze

Respuesta

13

&& tiene una higher precedence que =, de ahí la primera expresión se evalúa como:

isset($_REQUEST['test']) && $t = (trim($_REQUEST['test']) && !empty($t)) 

Desde !empty($t) se evalúa antes se asigna nada para $t, la expresión es false. Se podría solucionar este problema mediante paréntesis establecer explícitamente, o mediante el uso de una forma menos incómoda para escribirlo:

if (isset($_REQUEST['test']) && trim($_REQUEST['test'])) { 
    echo 'hi'; 
} 

trim($_REQUEST['test']) evaluará a true o false sólo por sí mismo, sin empty necesario. Si realmente necesita el valor med trim más tarde, se puede guardar de esta manera:

if (isset($_REQUEST['test']) && ($t = trim($_REQUEST['test']))) { 
    echo 'hi'; 
} 
1

Si realiza modificaciones menores como esto en su código:

if(isset($_REQUEST["test"]) && ($t=trim($_REQUEST["test"])) && !empty($t)){ 
    echo '1: hi<br/>'; 
} 

if(isset($_REQUEST["test"]) && $t=trim($_REQUEST["test"])){ 
    if(!empty($t)) 
     echo '2: hi<br/>'; 
} 

Entonces ambos se imprimirán 1: hi y 2: hi . La diferencia es paréntesis alrededor de la primera asignación $ t.

Cuestiones relacionadas