いくつかの文字列値を比較しているときに、PHP で奇妙で予期しない動作に遭遇しました。以下の最初の 2 つのステートメントは、false を返すと予想される場合に true を返します。最後のステートメントは、予想どおり false を返します。私は PHP のType Jugglingを認識していますが、ドキュメントから理解しているのは、文字列と整数のような 2 つの異なるデータ型を比較するときに型ジャグリングが発生するということです。以下の例では、両方のリテラルが文字列です。これは、PHP で文字列比較を行っているときに、両方の文字列を調べて整数のように見えるかどうかを確認し、そうであれば両方を整数に型キャストしてから、それらの整数値を比較することを意味します。したがって、私の質問は、この動作がどのような条件下で発生するか、PHP で文字列比較がどのように機能するかです。
var_dump("10" == "10.0000");
var_dump("10" == "+10.");
var_dump("10" == "10 ");
#output
bool(true)
bool(true)
bool(false)
アップデート
したがって、比較の下のババの答えには、何が起こっているのかを理解するのに本当に役立つ数値文字列が含まれています。関数is_numericは、文字列が数値文字列と見なされるかどうかを返します。興味深いことに"10 "
、数値文字列とは見なされませんが、数値文字列と見なされます" 10"
。PHP ソース コードを掘り下げたところ、is_numeric の実装はis_numeric_string_ex 関数にあると思います。これにより、PHP が文字列を数値文字列として扱うタイミングを正確に知ることができます。