2011-03-29 18 views
5

Aşağıdaki iki if s farklı sonuçlar üretti (ilk if echos hi, ikinci değil), neden? Neden $t değişken ataması işe yaramadı? $t 'in yerel kapsamı if koşullu koşullarında mı?php değişken ataması eğer koşullu ise

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

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

cevap

13

&& dolayısıyla birinci ifade olarak değerlendirilir, = daha higher precedence var şey $t atanan önce !empty($t) yana

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

değerlendirilir ifade false olup. Açıkça ayar parantez Bunu düzeltmek, ya da yazmak için daha az garip bir şekilde kullanarak olabilir:

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

trim($_REQUEST['test'])true ya da sadece kendisi tarafından false, gerekli hiçbir empty için değerlendirecektir. aslında sonradan trim med değeri gerekiyorsa, şöyle kaydedebilirsiniz:

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

kodunuzda böyle küçük bir modifikasyonu yaparsanız:

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/>'; 
} 

Sonra hem 1: hi ve 2: hi basılacaktır . Fark ilk $ t atama etrafında parantezdir.