ホームページ > バックエンド開発 > PHPチュートリアル > php - 弱い型付けの小さな落とし穴

php - 弱い型付けの小さな落とし穴

WBOY
リリース: 2016-08-08 09:31:38
オリジナル
1187 人が閲覧しました

今日グループで議論された問題を記録します。

問題の原因は
var_dump(md5('240610708') == md5('QNKCDZO')); //true
2 つの md5 文字列を比較演算子 (==) と比較すると、実際にはに等しい。
次の 2 つの値を出力します:
md5('240610708') //0e462097431906509019562988736854
md5('QNKCDZO') //0e8304004519934940580242199033 91

結果を見たとき、一見するとインターバルだと感じたので、0= = 0 は true を返しました。
後で思い出したところ、そうではないことがわかりました。
php 比較演算子:
http://php.net/manual/zh/ language.operators.comparison.php
例:

如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对。
ログイン後にコピー
<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true

switch ("a") {
case 0:
    echo "0";
    break;
case "a": // never reached because "a" is already matched with 0
    echo "a";
    break;
}
?>
ログイン後にコピー

つまり、この等価性は、2 つの文字列が整数で 0=0 になるためではありません。
ただし、科学表記である 0e4xxx == 0e8xxx 、つまり 0*10 の n 乗、つまり 0.0000 と 0.00000000
なので、結果は同等になります。

以上、内容の側面も含めて php の弱い型付けの小さな罠を紹介しましたが、PHP チュートリアルに興味のある友人に役立つことを願っています。

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