今日グループで議論された問題を記録します。
問題の原因は
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; } ?>
以上、内容の側面も含めて php の弱い型付けの小さな罠を紹介しましたが、PHP チュートリアルに興味のある友人に役立つことを願っています。