为啥使用 !== FALSE 来检查 php 中的 stripos?

Posted

技术标签:

【中文标题】为啥使用 !== FALSE 来检查 php 中的 stripos?【英文标题】:Why use !== FALSE to check stripos in php?为什么使用 !== FALSE 来检查 php 中的 stripos? 【发布时间】:2010-10-16 12:24:54 【问题描述】:

这是我正在查看的代码。

foreach ($header as $idx => $field) 
    if (stripos($field, 'foo') !== false) 
        $cols['foo'] = $idx;
     else if (stripos($field, 'bar') !== false) 
        $cols['bar'] = $idx;
     else if (stripos($field, 'brr') !== false) 
        $cols['brr'] = $idx;
     else if (stripos($field, 'ffo') !== false) 
        $cols['ffo'] = $idx;
    

对不起,也不知道如何漂亮地格式化代码,任何提示都将不胜感激。

我正在查看一些比我聪明得多的人编写的代码,所以我不倾向于相信我的第一印象只是将所有内容都更改为 if(stripos($foo)),但为什么要这样做?

【问题讨论】:

要格式化代码,请添加四 (4) 个前导空格 【参考方案1】:

答案是,在 php 中,“假”值可以由少数几个值来满足,例如空数组、空字符串、NULL、整数 0 等。请参阅 empty() 函数页面以获取完整列表:

http://php.net/empty

所以这会总是产生不正确的结果:

if(strpos("abc", "a"))  
  echo "Yes";
 else 
  echo "No";

因为“a”出现在第一个位置(索引 0),所以 PHP 认为“if (0)”为假。

当 strpos 没有在你的大海捞针中找到针时,它将返回布尔值 FALSE,这是你想用三等号运算符检查类型和值的结果。请参阅有关比较运算符的文档

http://www.php.net/manual/en/language.operators.comparison.php

【讨论】:

这不是一个“不正确”的结果,因为您对正确性的看法与语言不兼容。找到针的正确方法会给你正确的结果。 @PJBrunet 从所需逻辑的角度来看不正确...不是语言...【参考方案2】:

stripos返回一个字符串在另一个字符串中的位置,如果没有找到则返回false,所以推荐使用标识comparison operators(===, !==),因为PHP考虑0 作为“虚假”值,请考虑以下示例:

// Find the position of the 'a' character in the 'abc' string:
stripos('abc', 'a') !== false; // true, position is 0
stripos('abc', 'a') != false; // false, 0 is "falsy"

【讨论】:

【参考方案3】:

在 PHP 中,!== 表示不同类型的 AND 值。

如果 stripos() 返回除 false 以外的任何值(并且完全是“false”,而不是零),这意味着它找到了一些东西,即使位置为 0 并且返回了 int(0)。 0 和 false 在使用 == 进行标准比较时相等,但在使用身份 === 运算符时不相等,因此唯一知道 stripos() 是否具有发现可以确定的是使用 !== 比较 false 的值和类型(不相同,即 strpos() 的返回值的类型和值都相同。)

【讨论】:

【参考方案4】:

因为如果在位置 0 匹配的字符串,0 的计算结果为 false,所以请确保添加额外的 '=' 以便考虑该类型。

strpos() 在找到 NO 匹配时返回 false。

查看comparison operators。

【讨论】:

【参考方案5】:

不知道这样的东西是否更容易维护。取决于你是否在这些条件下做其他事情。但是您可以在配置文件 db 中设置键,作为参数传递给您的函数,或类似的。

$keys = array(
    'foo',
    'bar',
    'brr',
    'ffo',
);
foreach ($header as $idx => $field) 
    foreach ($keys as $key) 
        if (stripos($field, $key) !== false) 
            $cols[$key] = $idx;
            break;
        
    

【讨论】:

以上是关于为啥使用 !== FALSE 来检查 php 中的 stripos?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 null 函数而不是 == [] 来检查 Haskell 中的空列表?

为啥相等检查不适用于数组[重复]

为啥在 PHP (-1 > false) 中返回 true? [复制]

为啥滚动网格中的 jqxgrid 未选中复选框或单选按钮列?

php 编程,使用file_get_contents('http://www.vketch.com/')获取远程页面超时为啥不会返回false

为啥在给定文本行中的数字时 IsNumeric() 返回 False