有没有令人信服的理由在比较操作中使用PHP的运算符===,超过==?

时间:2015-04-14 17:27:05

标签: php operators equals-operator

说我有这段代码:

$str = '5';
$int = 5;

为了比较,有没有理由使用这样的东西(转换):

if ($int === intval($str)) //...

或者我只使用本机PHP设施?

if ($int == $str) //...

对我来说,==看起来更简单,也许是以让PHP为我做额外的工作为代价。

3 个答案:

答案 0 :(得分:1)

取决于你想要做什么。某些函数可能会返回false0或正整数,例如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

请参阅String conversion to numbers

答案 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)

==运算符只是检查左右值是否相等。但是,===运算符(注意额外的“=”)实际检查左边和右边的值是否相等,并检查它们是否属于相同的变量类型(比如它们是否都是布尔值,整数)等)。