これは、文字列を数値として使用できることを意味する型ジャグリングが原因であり、「緩やかに等しい」比較演算子を使用しているためです。 ==
式のオペランドが数値(つまり、数字を含み、数値と見なすことができる)の場合、比較される前に適切な数値型 (integer
または) に変換されます。float
したがって、これは PHP が実際に次の式を認識する方法です。
("+494321" == "00494321") => (494321 == 494321)
最初のオペランドではプラス記号が削除され (数値が正であることを意味するだけです)、2 番目のオペランドではゼロが切り捨てられます (これらは実際には何の意味もありません。つまり07
、 と7
は両方とも同じ 10 進数であり、表現が少し異なるだけです)。
2 つの文字列を正確に比較するには、いくつかの方法があります。1 つ目は、単純に「正確に等しい」演算子を使用すること===
です。この演算子を使用すると、オペランドの型がジャグリングされることはありません。つまり、比較演算子の両側が完全に一致します。文字列は文字列になり、整数は整数になります。
例として、これら 2 つの式は両方とも と等しくなりfalse
ます。
"123" === 123
"006" === 6
もう 1 つの方法は、strcmp
関数 (または同様の関連関数) を使用することです。文字列をバイトごとに比較します。
$a = "+494321";
$b = "00494321";
if (strcmp($a, $b) === 0) {
echo "The same";
} else {
echo "Not the same";
}
この関数は0
、2 つの文字列に違いがない (つまり、違いがない) 場合に戻ります。返された数値がそれより小さいか大きい場合0
、2 つの文字列は同じではありません。