私は最近、せいぜいバグのように見える状況に遭遇しました。との両方が、比較で使用された場合、負の無限大よりも低く評価されているよう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バージョンと、私がアクセスしたいくつかのWindowsマシンで実行されました。すべてが驚くべき同じ結果をもたらしました。
最初の2つのデバッグダンプを無視すると、次の6つの結果は、経験豊富なPHP開発者であれば期待できるものです。最初の2つは型ジャグリングによるもので、最後の4つはPHPと数学によるものです。
さて、最後の4つは私を悩ませているものです。
負の無限大よりも低いものを持つことが数学でさえ有効であるかどうかはわかりません。
さらに奇妙なのは、最初の2つと最後の2つの比較の組み合わせです。どういうわけか、同じタイプのジャグリングアルゴリズムがこれを有効にします。
var_dump(
'Insane In The Membrane (Redux)',
(null == 0) && (null < (-1*INF)), # true
(false == 0) && (false < (-1*INF)) # true
);
これらの型キャストがどのように異なって評価されているのか、そしてなぜそれが大いに評価されるのかについて誰かが洞察を与えることができれば。
PS私は何度も何度もSOを検索しようとしましたが、 PHPマニュアル、さらにはPHPバグトラッカーでさえも役に立ちませんでした。私はCのソースコードを調べて、このコードをそのように機能させるための要素を特定してみました。まだサイコロはありません。