ホームページ >バックエンド開発 >PHPチュートリアル >PHP で `strpos()` の戻り値を大まかにチェックすると予期しない結果が生じるのはなぜですか?

PHP で `strpos()` の戻り値を大まかにチェックすると予期しない結果が生じるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-11 20:15:11818ブラウズ

Why Does Loosely Checking `strpos()`'s Return Value Lead to Unexpected Results in PHP?

strpos() の戻り値を緩やかにチェックした場合の意図しない結果

strpos() を使用して文字列内の部分文字列を検索する場合、次のことが重要です。戻り値を評価するために等価比較または不等価比較を使用する場合の潜在的な落とし穴を理解します。 PHP ドキュメントには、部分文字列が見つからない場合に strpos() が false を返すと記載されていますが、0 (文字列の始まりを示す) を返すと予期しない結果が生じる可能性があります。

この問題を説明するには、次のコード スニペット:

if (
    strpos($grafik['data'], $ss1) <> false
    && strpos($grafik['data'], $ss2) <> false
    && strpos($grafik['data'], $ss1) < strpos($grafik['data'],$ss2)
)

その目的は、$grafik['data'] 内の $ss1 と $ss2 の存在を検証し、次のことを確認することです。 $ss1 は $ss2 の前に表示されます。ただし、これは、$ss1 が文字列の先頭で始まるときに strpos() が 0 を返すという事実を考慮していません。

PHP ドキュメントによると:

警告

この関数はブール値の FALSE を返す場合がありますが、ブール値以外の値を返す場合もあります。 0 や "" など、FALSE と評価されます。詳細については、ブール値に関するセクションを参照してください。この関数の戻り値をテストするには、=== 演算子を使用します。

この問題に対処するには、緩やかな等価演算子 == の代わりに厳密な等価演算子 === を使用する必要があります。

if (
    strpos($grafik['data'], $ss1) !== false
    && strpos($grafik['data'], $ss2) !== false
    && strpos($grafik['data'], $ss1) < strpos($grafik['data'],$ss2)
)

=== を使用すると、部分文字列が見つかった場合、比較では strpos() の戻り値が true として正しく評価されます。この変更により、コード スニペットの意図した論理動作が保証されます。

以上がPHP で `strpos()` の戻り値を大まかにチェックすると予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。