ホームページ > バックエンド開発 > PHPチュートリアル > PHP の緩やかな型比較により、文字列と整数を比較するときに予期しない結果が生じるのはなぜですか?

PHP の緩やかな型比較により、文字列と整数を比較するときに予期しない結果が生じるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-07 13:35:13
オリジナル
671 人が閲覧しました

Why Does PHP's Loose Type Comparison Lead to Unexpected Results When Comparing Strings and Integers?

文字列と整数の比較の異常

PHP で文字列と整数を比較すると、予期しない結果が発生する可能性があります。次のコードを考えてみましょう。

$test1 = "d85d1d81b25614a3504a3d5601a9cb2e";
$test2 = "3581169b064f71be1630b321d3ca318f";

if ($test1 == 0)
  echo "Test 1 is Equal!?";
if ($test2 == 0)
  echo "Test 2 is Equal!?";

// Returns: Test 1 is Equal!?
ログイン後にコピー

驚くべきことに、$test1 の比較は、数値ではないにもかかわらず、true と評価されます。この異常は、PHP の緩い型変換ルールに起因します。

文字列から数値への変換

PHP マニュアルによると、

「文字列が評価されるとき」数値コンテキストでは、結果の値と型は次のように決定されます。

  • 文字列に「.」、「e」、「E」のいずれかの文字が含まれている場合は、浮動小数点として評価されます。
  • それ以外の場合は、浮動小数点として評価されます。整数として評価されます。

文字列が有効な数値データで始まる場合、値は文字列の最初の部分によって与えられます。これが使用される値になります。それ以外の場合、値は 0 (ゼロ) になります。"

異常の説明

この例では、$test1 には次の値が含まれていません。小数点、指数、または先行ゼロ。したがって、初期値 0 の整数として解釈されます。0 は PHP の整数 0 と等しいため、比較は true と評価されます。

$test2 が失敗する理由

文字列 $test2 には数字以外の文字も含まれています。ただし、数字で始まるため、その初期値は 3581169 の整数として解釈されます。この整数は 0 に等しくないため、誤った比較が行われます。

型異常の回避

これらの異常を防ぐために、常に厳密な型比較を使用してください。提供されている例では、コードを次のように書き換えることができます:

if ($test1 === "0")
  echo "Test 1 is Equal!";
if ($test2 === "0")
  echo "Test 2 is Equal!?";
ログイン後にコピー

厳密な比較演算子 === を使用することで、値が同じ型であることが保証され、予期しない結果が発生するのを防ぎます。

以上がPHP の緩やかな型比較により、文字列と整数を比較するときに予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート