是否有令人信服的理由使用PHP';s运算符===在比较操作中,over==?

是否有令人信服的理由使用PHP';s运算符===在比较操作中,over==?,php,operators,equals-operator,Php,Operators,Equals Operator,假设我有这个代码: $str = '5'; $int = 5; 作为比较,是否有任何理由使用这样的东西(带转换): 还是只使用本机PHP工具 if ($int == $str) //... 对我来说,=看起来更简单,可能是以让PHP为我做额外工作为代价。==操作符只是检查左右值是否相等。但是,===运算符(注意额外的“=”)实际上检查左右值是否相等,还检查它们是否属于相同的变量类型(例如它们是否都是布尔值、整数等) 取决于你想做什么。有些函数可能返回false或0或正整数,如strpos()

假设我有这个代码:

$str = '5';
$int = 5;
作为比较,是否有任何理由使用这样的东西(带转换):

还是只使用本机PHP工具

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

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

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

取决于你想做什么。有些函数可能返回
false
0
或正整数,如
strpos()
0
表示字符串位于位置
0
,因此
==false
不会像
==false
那样工作

在您的场景中,可以使用
==
,因为这在从DB或
$\u POST
$\u GET
获取值时很常见,它们将始终是字符串

多亏了Fred Emmott的评论:小心,以下返回值
true

var_dump('0xa' == '10');   // 0xa hex 10 in decimal
var_dump('10pigs' == 10);  // pigs truncated

请参见

使用“==”往往会导致微妙的错误-例如,如果两个字符串看起来像数字,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

如果您不关心数据类型,则没有理由使用==。如果您确实关心数据类型,则需要使用==。因此,仅当数据类型很重要时,我才保留===。然后,如果我在代码中看到a===的话,我知道它存在的原因是非常充分的$y='0e830400451993494058024219903391';变量转储($x==y);//下面的单独答案中有更详细的示例@FredEmmott谢谢。编辑。
<?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