身份条件“===”,性能和转换

时间:2011-05-02 05:11:51

标签: php performance comparison fuelphp

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

我可能会以错误的假设来实现,所以我假设这个问题的一部分是“我的假设是真的吗?”

其次,

我正专门处理一种情况,即我以字符串"100"的形式从数据库中获取数据。

我正在比较的代码是......

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

VS

    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');
    }

是通过手动转换或转换获得的任何完整性(或性能),因此您可以使用身份('===')比较?

5 个答案:

答案 0 :(得分:13)

在您的特定情况下,==是更好的选择。正如您(在代码中可以看到)可能已经发现许多数据库函数将始终返回字符串,即使您获取整数。因此,键入严格比较实际上只会使您的代码膨胀。

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

所以:不要过度使用严格的比较,它并不总是好的。你主要只在不明确的情况下需要它,比如strpos的返回值。

答案 1 :(得分:4)

=====之间存在性能差异 - 后者的速度甚至会快两倍,请参阅Equal vs identical comparison operator。 然而,差异太小而不能被打扰 - 除非代码执行了数百万次。

答案 2 :(得分:3)

这是你在那里做的非常小的优化。就个人而言,我认为这不值得。

当您显式转换值时,使用===时未通过转换值获得的任何提升都会丢失。在您的情况下,由于类型对您来说并不重要,您应该==并完成它。

我建议您在需要检查类型时保留=== - 例如0评估为假等等。

答案 3 :(得分:3)

任何性能提升在微观上都是微不足道的,除非你在数天内进行数十亿甚至数万亿次的比较,持续数日/月/年。严格的比较确实有它的用途,但它在PHP中也有些异常。 PHP是一种弱类型语言,并且(通常)自动转换/转换值是正确的。大多数情况下,没有必要进行严格的比较,因为PHP会做正确的事情。

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

答案 4 :(得分:3)

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

array() == NULL

0 == 'Non-numeric string'

始终使用变量和字符串之间的严格比较

$var === 'string'