2011-11-10 49 views
7

我比較兩個字符串,像這樣:整數字符串比較是相等的(PHP錯誤?)

<?php 

$Str1 = '111122223333444455556666'; 
$Str2 = '111122223333444455557777'; 

if($Str1 != $Str2){ 
    // Do something 
} else { 
    // Do something else 
} 

?> 

顯然,$ str1和不一樣的$ STR2,但仍始終執行else區塊。我知道我應該簡單地使用===!==來比較這裏,但我想知道爲什麼(基本上)我嘗試的任何其他值實際上評估它的預期方式。

我也在文檔「如果字符串不包含任何字符'','e'或'E'並且數值符合整數類型限制(由PHP_INT_MAX定義)該字符串將被評估爲一個整數「,所以我猜它不應該低於或等於PHP_INT_MAX的值(這遠遠小於我上面評估的字符串) - 假設這就是他們的意思通過「適合」。那麼爲什麼上面的字符串被評估爲相同?它可能是一個PHP的錯誤,或者有什麼我失蹤?


我使用的PHP版本5.3.8自昨天起,來自PHP 5.3.6。在Windows XP上運行。

+0

我不能在我的5.3.5安裝中重新創建它。字符串比較爲「不等於」和「不不等於」。 –

+0

我在PHP 5.2.5(http://codepad.org/BJZT1KM1)和PHP 5.3.9-dev(http://codepad.viper-7.com/MxwYQw)上重新創建了它。 –

回答

7

這裏發生的事情是數字被轉換爲浮點數(因爲它們不適合int),浮點數恰好相同。見the PHP source

This script顯示解析後的浮動確實具有相同的值。

+0

多麼奇怪的現象。我試圖弄清楚(顯然在一個更復雜的腳本)幾個小時,事實證明這是唯一的問題。有時候PHP可以真正讓你感到尷尬。這回答了我的問題 - 這是一個很好的答案。謝謝! – user966939

1

那是什麼樣子,如果我這樣做:

$Str1 = '111122223333444455556666 '; 
$Str2 = '111122223333444455557777 '; 

它配備了罰款(注意空格)

所以它必須被轉換爲數字並沒有看到,因爲長度的差異

1

有人可能認爲PHP在這些轉換中有點放鬆嗎?! 再說一次,你是否想要好的舊的嚴格類型檢查?

不像上面那樣先進,但仍然足以抓住我最近一個小時的時間。

<? 
$a_var = 0; 
if ($a_var=="WHATEVER") 
    echo "WATCH OUT! This will be printed!"; 
//- as "whatever" is converted to an int 

if ((string)$a_var=="WHATEVER") 
    echo "OK, this will of course not be printed!"; 

$a_var = "0"; 
if ($a_var=="WHATEVER") 
    echo "OK, this will of course also not be printed!"; 
?> 

結論:注意PHP中的自動鑄件。 它可能會時不時玩弄你,並且bug可能很難跟蹤。明確投射一次太多時,可能會更聰明,而不是依靠我們偉大的PHP理解。 ;-)

+0

OMG這讓我瘋狂!我有'if($ var ==「E」){echo「這在$ var是int(0)時打印」; }' – SublymeRick