使用==与strcmp进行字符串比较

Jie*_*eng 323 php

PHP的===运算符似乎区分大小写?那么有什么理由可以使用strcmp()吗?做以下事情是否安全:

if ( $password === $password2 ) { ... }
Run Code Online (Sandbox Code Playgroud)

dec*_*eze 319

使用它的原因是因为 strcmp

如果str1小于str2,则返回<0; 如果str1大于str2则> 0,如果它们相等则为0.

===只返回true或者false,它不会告诉你哪个是"更大"的字符串.

  • strcmp与匹配字符串花了0.207852秒strcmp与非匹配字符串花了0.215276秒===匹配字符串花了0.067122秒===与非匹配字符串花了0.057305秒http://snipplr.com/view/758/ (150认同)
  • 为什么这个答案得到最多的支持呢?我正在低估,因为虽然这个问题应该得到答案,但不是"正确"的答案.正确答案应该是'使用===',因为很多人已经在其他答案中说过了. (20认同)
  • 在我目前的情况下,我不需要知道哪个字符串更大:) (9认同)
  • strcmp的另一种用法是显示排序.要更清楚地排序.如果string1在string2之前排序,则strcmp()返回<0;如果string2在string1之前排序,则返回> 0;如果string2相同,则返回0.例如$ string_first ="aabo"; $ string_second ="aaao"; echo $ n = strcmp($ string_first,$ string_second); 将返回大于零,因为aaao在aabo之前排序. (3认同)
  • @onurgüngör实际上,这个*确实*回答了op的问题,那就是"所以有没有理由使用strcmp()?",而Postfuturist的答案却没有.哦,地狱......没有人回答似乎立刻编译了`strcmp()`的****,`===`的**性能**和`==的*可靠性*`用于字符串比较...所以我将我的名字添加到列表中. (2认同)

pos*_*ist 216

你永远不应该==用于字符串比较.===没关系

$something = 0;
echo ('password123' == $something) ? 'true' : 'false';
Run Code Online (Sandbox Code Playgroud)

只需运行上面的代码,你就会明白为什么.

$something = 0;
echo ('password123' === $something) ? 'true' : 'false';
Run Code Online (Sandbox Code Playgroud)

现在,这好一点.

  • @AndyLobel PHP使用它的奇怪松散比较规则将'password123'强制转换为数字,因为另一个操作数是一个数字,该字符串与大多数一样强制为0,而PHP返回true用于比较. (23认同)
  • ==不仅仅是不同类型的问题.即使双方都是一个字符串,它有时会产生意想不到的结果.试试'1e3'=='1000' (19认同)
  • 快速var_dump((int)'password123'); 帮助我完全理解为什么会发生这种情况......**尴尬**...我真的很喜欢===运算符 (8认同)
  • 0 =='password123'怎么办? (3认同)
  • 如果两个操作数中的一个可转换为数字,php将两个操作数转换为数字,则更多,如果非数字字符串转换为数字,则取值为零,结果等于零,这是beacuse使用'=='因此,与简单的'=='进行比较的结果可能是不必要的 (3认同)

Ant*_*ony 97

不要==在PHP中使用.它不会做你期望的.即使您将字符串与字符串进行比较,PHP也会隐式地将它们转换为浮点数,并在它们看起来是数字时进行数值比较.

例如,'1e3' == '1000'返回true.你应该使用===.

  • 但你可以===. (16认同)
  • @Roman是的,但许多PHP程序员不知道他们必须这样做.因此警告. (11认同)
  • @Antimony那么为什么不告诉他们他们应该在你的答案中做些什么呢? (5认同)

Aji*_*ith 43

嗯..根据这个php bug报告,你甚至可以得到0wned.

<?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.';
    }
 ?>
Run Code Online (Sandbox Code Playgroud)

它会给你一个警告,但仍会绕过比较.
你应该===像@postfuturist建议的那样做.

  • 哇+1.从链接引用:"这是函数的已建立行为,它接收错误类型的参数以返回null".考虑到手册只是说:"如果str1小于str2则返回<0;如果str1大于str2则返回0,如果它们相等则返回0".Null没有被提及作为一种可能性,但在诸如substr手册页之类的页面上提到它.*叹* (5认同)

小智 33

永远记住,在比较字符串时,您应该使用===运算符(严格比较)而不是 ==运算符(松散比较).

  • 实际上,我认为在比较*任何*时你应该使用`===`是安全的. (8认同)

Bal*_*our 22

总结所有答案:

  • ==字符串比较是一个坏主意.
    在许多情况下,它会给你"惊人"的结果.不要相信它.

  • === 很好,会给你最好的表现.

  • strcmp() 如果您需要确定哪个字符串"更大",则应该使用它,通常用于排序操作.


Nik*_*ski 20

使用==可能很危险.

注意,如果两者不同,它会将变量转换为另一种数据类型.

例子:

  • echo (1 == '1') ? 'true' : 'false';
  • echo (1 == true) ? 'true' : 'false';

如您所见,这两个来自不同类型,但结果是true,这可能不是您的代码所期望的.

===但是,建议使用,因为测试表明它比strcmp()它不敏感的替代方案快一点strcasecmp().

快速谷歌搜索大喊这个速度比较:http://snipplr.com/view/758/


ung*_*rys 11

strcmp()和"==="都区分大小写,但"==="更快

示例代码:http://snipplr.com/view/758/


kta*_*kta 6

strcmp将根据它运行的环境返回不同的值(Linux/Windows)!

原因是它有bug,因为bug报告说 https://bugs.php.net/bug.php?id=53999

请小心处理!!谢谢.