2013-01-16 23 views
3

我最近偶然發現了一個似乎是最好的錯誤的情況。當用於比較時,nullfalse似乎被評估爲降低但不等於負無窮大。PHP:比較NULL和FALSE - 鑄造〜負無窮

我目前的測試案例:

var_dump(
    PHP_OS, 
    PHP_VERSION, 
    null == 0,      # true 
    false == 0,      # true 
    INF==INF,       # true 
    (-1*INF) == (-1*INF),    # true 
    (-1*INF) < (-1*INF),    # false! 
    (-1*INF) > (-1*INF),    # false! 
    'Insane In The Membrane', 
    null == (-1*INF),     # false!? 
    false == (-1*INF),    # false!? 
    null < (-1*INF),     # true! 
    false < (-1*INF)     # true! 
); 

這是各種PHP Versions和一些Windows機器,我不得不進入運行。所有人都有驚人的相同結果。


忽略前兩個調試場,接下來的6分的結果是,如果你是一位經驗豐富的PHP開發者你所期望。前兩個是由於type juggling和最後4個,歸因於PHPmath


現在最後四個是什麼在擾亂我。

我不確定它是否有效有效在數學上有一些低於負無窮大。

什麼是陌生人仍然是前兩個和最後兩個比較的組合。不知怎的,同一類型的雜耍算法做出此有效:

var_dump(
    'Insane In The Membrane (Redux)', 
    (null == 0) && (null < (-1*INF)),  # true 
    (false == 0) && (false < (-1*INF))  # true 
); 

如果任何人都可以提供任何洞察力,對這些類型轉換是如何被評價,從而不同,爲什麼將不勝感激。


P.S. I have tried搜索SO againagainagainPHP Manual甚至PHP bug tracker,都無濟於事。我嘗試通過C源代碼來確定使代碼按其工作方式工作的位數。仍然沒有骰子。

+3

誰會想到; PHP的拜占庭式類型轉換規則仍然導致莫名其妙的行爲;) –

+0

我想一種解釋是'null'肯定不比* -inf大*,並且*不等於-inf。所以通過消除... –

+0

@OliCharlesworth嘿,我同意它不是_equal_,但爲什麼它不是_greater_?它應該被評估爲0(因爲它在我的問題的第二個場景中)並且**比**大於-inf。我對傳遞給'cmp'彙編指令的內容感到困惑。我不知道如何處理無窮大,現在我不知道「null」和「false」是如何處理的。 – Khez

回答

2

我只是在昨天看着這個。我們來試試看PHP手冊,並期待在比較操作頁面:

http://php.net/manual/en/language.operators.comparison.php

有一個偉大的圖表有解釋當不同類型的對象進行比較會發生什麼,這是它的一列:

bool or null anything Convert to bool, FALSE < TRUE 

因此,null被轉換爲false,任何非零數字被轉換爲true。 Source而且,正如你所看到的,FALSE <爲真。這就是爲什麼你會被認爲是瘋狂的行爲 - 至於爲什麼會出現這種情況,這可能是因爲C的行爲類似。 (但C從來不會讓你用打字系統快速而鬆散地玩這個!)

+0

認爲它可能是明顯的東西...謝謝你的回答:) – Khez

1

也許這將幫助:

http://gynvael.coldwind.pl/?id=492

它主要涵蓋了==操作符,但也有關於比較的一般工作原理的一些信息和指針。

+0

充其量,該鏈接提供了洞察力,爲什麼'null == 0'和'null!=( - 1 * INF)',如上所述,經驗豐富的開發人員已經明白爲什麼。這個問題似乎與__less than__運算符嚴格一致,使'null'和'false'小於** ANY ** **(除+/- 0)。 – Khez

+0

優秀的文章。感謝您的鏈接! – dnagirl