PHP的===
运算符是区分大小写的。那么使用strcmp()
有什么理由吗?
像下面这样做是否安全?
if ($password === $password2) { ... }
PHP的===
运算符是区分大小写的。那么使用strcmp()
有什么理由吗?
像下面这样做是否安全?
if ($password === $password2) { ... }
strcmp
返回结果为负数代表 str1 小于 str2;返回结果为正数代表str1大于str2, 如果相等则返回0。而===
仅返回true
或false
,不能告诉您哪个字符串更“大”。strcmp()
的用途,===
的性能,以及对于字符串比较的不良可靠性的解释...所以我将我的答案加入到列表中。 - Balmipour在进行字符串比较时,永远不要使用 ==
。使用 ===
是可以的。
$something = 0;
echo ('password123' == $something) ? 'true' : 'false';
运行上面的代码,你就会明白原因。
$something = 0;
echo ('password123' === $something) ? 'true' : 'false';
现在,这好多了。
不要在PHP中使用==
。它不会如你所期望地执行操作。即使你将字符串与字符串进行比较,如果它们看起来是数字,PHP也会将它们隐式转换为浮点数并执行数字比较。
例如,'1e3' == '1000'
返回true。你应该使用===
代替。
<?php
$pass = isset($_GET['pass']) ? $_GET['pass'] : '';
// Query /?pass[]= will authorize user
//strcmp and strcasecmp both are prone to this hack
if ( strcasecmp( $pass, '123456' ) == 0 ){
echo 'You successfully logged in.';
}
?>
它会给你一个警告,但仍然会绕过比较。
像 @postfuturist 建议的那样,你应该使用 ===
。
记住,比较字符串时应使用 ===
运算符(严格比较),而不是使用 ==
运算符(松散比较)。
===
。 - rink.attendant.6==
在字符串比较中是一个不好的选择。
在许多情况下,它会给出“令人惊讶”的结果。不要相信它。
===
是可以的,并且会给你最好的性能。
如果需要确定哪个字符串“更大”,通常用于排序操作,应该使用strcmp()
。
使用 ==
可能是危险的。
请注意,如果两个变量类型不同,它会将其中一个转换为另一种数据类型。
例子:
echo (1 == '1') ? 'true' : 'false';
echo (1 == true) ? 'true' : 'false';
如您所见,这两个变量属于不同的类型,但结果却是true
,这可能不符合您代码的预期。
相比于strcmp()
和它的不区分大小写的替代品strcasecmp()
,建议使用===
进行判断。
通过快速搜索可以找到此速度比较:http://snipplr.com/view/758/
"012" == "12"
,php也会将这两个字符串的类型更改为整数 12 == 12
,然后返回 true
。 - GoTo根据运行环境 (Linux/Windows),strcmp会返回不同的值!
原因在于它存在一个漏洞,正如漏洞报告所述 - Bug #53999strcmp() doesn't always return -1, 0, or 1
如果您希望按字典顺序排序/比较字符串(词汇上),可以使用strcmp()
。如果只是想检查相等性,则 ==
就可以了。
===
。 - Ash
strcmp
有什么关系? - kennytmstrcmp
区分大小写。在一些编程语言中,如 VB,字符串比较可能不区分大小写,从而返回不同的结果。但在 PHP 中并非如此。 - cHao===
而不是==
,因为'0XAB' == '0xab'
的结果是 true。 - kennytm