说我有这段代码:
$str = '5';
$int = 5;
为了比较,有没有理由使用这样的东西(转换):
if ($int === intval($str)) //...
或者我只使用本机PHP设施?
if ($int == $str) //...
对我来说,==
看起来更简单,也许是以让PHP为我做额外的工作为代价。
答案 0 :(得分:1)
取决于你想要做什么。某些函数可能会返回false
或0
或正整数,例如strpos()
。 0
表示在0
位置找到字符串,因此== false
无效=== false
。
在您的方案中,可以使用==
,因为这在从数据库或$_POST
和$_GET
获取值时很常见,它们始终是字符串。
感谢Fred Emmott的评论:小心,以下返回true
:
var_dump('0xa' == '10'); // 0xa hex 10 in decimal
var_dump('10pigs' == 10); // pigs truncated
答案 1 :(得分:1)
使用'=='往往会导致细微的错误 - 例如,如果两个字符串看起来像数字,PHP不会将它们作为字符串进行比较,这会产生意想不到的结果 - 最常见/可怕的例子是:
<?php
$actual_password = '240610708';
$provided_password = 'QNKCDZO';
// These would presumably be stored in your database
$stored_password_md5 = md5($actual_password); //0e462097431906509019562988736854;
$stored_password_hash = password_hash($actual_password, PASSWORD_DEFAULT);
$computed_password_md5 = md5($provided_password); //0e830400451993494058024219903391
var_dump($stored_password_md5 == $computed_password_md5); // bool(true) - BAD! NO!
var_dump($stored_password_md5 === $computed_password_md5); // bool(false) - Better, but still no. Vulnerable to timing attacks
var_dump(hash_equals($stored_password_md5, $computed_password_md5)); // bool(false) getting somewhere
var_dump(password_verify($provided_password, $stored_password_hash)); // bool(false) best
虽然在你的具体例子中,这个问题没有发生,可能的问题导致很多人推荐/ always / use ===,所以你不必记得==什么时候是安全的它不是。
答案 2 :(得分:0)
==运算符只是检查左右值是否相等。但是,===运算符(注意额外的“=”)实际检查左边和右边的值是否相等,并检查它们是否属于相同的变量类型(比如它们是否都是布尔值,整数)等)。