身份条件"==="性能和转换


identity conditional "===" , performance, and conversion

我总是远离stackoverflow的答案和我所做的任何阅读"==="优于"==",因为使用了更严格的比较,并且您不会浪费资源转换值类型以检查匹配。

我可能有一个错误的假设,所以我假设这个问题的一部分是,"我的假设是正确的吗?"

其次,

我特别处理的情况是,我从一个字符串"100"的形式从数据库中获取数据。

我比较的代码是…

    if ($this->the_user->group == 100) //admin
    {
        Response::redirect('admin/home');
    }
    else   // other
    {
        Response::redirect('user/home');
    }

    if ( (int) $this->the_user->group === 100) //admin
    {
        Response::redirect('admin/home');
    }
    else   // other
    {
        Response::redirect('user/home');
    }

或者

    if (intval($this->the_user->group) === 100) //admin
    {
        Response::redirect('admin/home');
    }
    else   // other
    {
        Response::redirect('user/home');
    }
通过手动强制转换或转换是否获得了任何完整性(或性能),以便您可以使用标识('===')比较?

在您的特殊情况下,==是更好的选择。正如您(从您的代码中可以看到)可能已经发现许多数据库函数总是返回字符串,即使您获取的是整数。所以类型严格比较只会使你的代码膨胀。

此外,您还增加了潜在的(我们称之为理论上的)安全风险。例如,(int) '100AB2'会生成100。在你的情况下,这可能不会发生,但在其他人可能会。

所以:不要过度使用严格的比较,它并不总是好的。您主要只在模棱两可的情况下才需要它,例如strpos的返回值。

=====之间存在性能差异-后者甚至会快两倍,参见相等与相同比较运算符。然而,这个差别太小了,除非代码被执行了数百万次。

这是一个非常小的优化。就我个人而言,我认为这真的不值得。

当你显式地强制转换该值时,你从使用===时不强制转换该值而获得的任何增强都会丢失。在您的情况下,由于类型对您不重要,您应该只执行==并完成它。

我的建议是当你需要检查类型时也保留=== -例如0评估为false等等。

任何性能提升都是微乎其微的,除非您连续几天/几个月/几年执行数十亿甚至数万亿次这样的比较。严格比较确实有它的用途,但它在PHP中也有些不正常。PHP是一种弱类型语言,并且(通常)为自动转换/转换值做正确的事情。大多数时候,没有必要做严格的比较,因为PHP会做正确的事情。

但是在某些情况下,例如使用strpos时,自动转换将失败。strpos将返回'0',如果你正在搜索的指针正好在干草堆的开始,这将被视为FALSE,这是错误的。处理这个问题的唯一方法是通过严格比较。

PHP有一些返回TRUE的WTF松散比较,如:

array() == NULL
0 == 'Non-numeric string'

始终对变量和字符串进行严格比较

$var === 'string'