2013-08-31 153 views
0

我在我的一些PHP代碼中遇到了一個非常奇怪的問題。我在IF語句中返回true的變量顯然應該返回false。PHP變量隨機更改

$pr = $_SESSION['fin_print_printer']; //this should equal 0  
print $pr; //this returns 0, as it should 
if($pr == "L"){ 
    print "local"; 
} else { 
     print "serve"; 
} 
print $pr; //this returns 0 again, as it should 

這會在我的腳本中打印「本地」(在兩個零之間)並且不打印「serve」。在我的項目中有超過100,000行代碼,我還沒有遇到這個問題,現在我無法弄清楚發生了什麼。

如果我如果($ pr ===「L」),那麼它按預期工作,但上面沒有。

+0

顯示一個示例輸出,如果'$ pr'是'0',如您所述,這在邏輯上不可能爲0到==「L」 –

+0

使用三倍等於那裏if($​​ pr ===「L」)' – Davit

+0

在這種情況下'=='或'==='應該不重要 –

回答

1

PHP正試圖強制轉換 'L' 變成一個int,其結果爲0

intval('L'); // 0 

變化你的代碼下面因此將需要類型的考慮:

if($pr === "L") 
{ 
    print "local"; 
} 
else 
{ 
    print "serve"; 
} 

或手動類型轉換$pr到一個字符串。

// You can also to (string)$pr ("0" instead of 0) 
if(strval($pr) == "L") 
{ 
    print "local"; 
} 
else 
{ 
    print "serve"; 
} 
+0

謝謝!正如另一位用戶所評論的,L在邏輯上不可能等於0,這就是爲什麼我發現這個讓人難以置信的原因。但是,謝謝你的幫助。使用strval()效果很好(與預期的==一樣)。 –

+0

@KyleLawrence你也可以用'(string)$ pr'來形式化它。正如一個額外的說明。關於L爲0,它只是PHP解釋器嘗試將L與一個整數進行比較,因爲int中的$ pr'。 – MisterBla

0

也許如果你使用的類型轉換(餘did't檢查):

if ((string)$pr == "L") { 
    print "local"; 
} else { 
     print "serve"; 
} 
+0

它的工作原理。 http://3v4l.org/G6Rg5雖然我可能會說,使用'==='會更容易。 – MisterBla

0

鮮爲人知的方法:你也可以這樣做

if ("L" == $pr) { 

鑄造由於鬆散的比較,PHP投下正確的值到左值的類型,因爲你已經被意識到而string(1)"L"被鑄造爲int(0),int(0)被鑄造爲string(1)"0"