在平等比较会产生与严格的相等比较相同的结果的情况下,应该使用哪两个?

时间:2013-01-22 16:36:15

标签: php coding-style operators

要使用示例,是$name == "John Doe"还是$name === "John Doe"

我猜测平等比较会表现得更差,因为他们会进行某种类型的投射。

P.S。我知道选择一个相对于另一个的性能增益可以忽略不计,如果有的话。这是一个原则问题。

5 个答案:

答案 0 :(得分:3)

在大多数代码中,你真的不需要检查===,如果你仔细考虑到你没有使用强类型语言的事实,但是当你编写PHP时这应该是一个不变的想法代码。

我通常使用==,保留===到PHP手册建议的内容(即strpos()调用和similars)。

这是我运行的一些实证基准。也许我应该切换到===; - )

$start = microtime(true);

for($i = 0; $i < 1000000; $i++) {
    if("1" === 1); 
}

$end = microtime(true);

echo number_format($end - $start,5,',','.') . " seconds";

// 0,06117 seconds for "thestring" === "thestring"
// 0,07601 seconds for "thestring" == "thestring"

// 0,05154 seconds for "1" === 1
// 0,09041 seconds for "1" == 1

答案 1 :(得分:1)

我总是选择最有效的,在前提下我可以防止在将来未发现的更改期间发生某些逻辑错误。我还没有对这个程序感到难过。

答案 2 :(得分:0)

除了平等之外,

===也会检查type。这是比较运算符的manual

如评论中所述,我编辑了我的答案,

当您不知道比较的值的类型时,使用

==,例如。带有数字的字符串 - if($str == $num),其中$ str ='5'和$ num = 5.当您想要比较它们的类型(严格)时,使用===。多年来,我了解到使用===更好,因为在大多数情况下作为程序员,你确实知道你要比较的类型,从长远来看,严格的编程实践总是更好(更高效,减少错误。)

答案 3 :(得分:0)

我认为这取决于需要。

$s = '0';
echo $s == '' ? 1 : 0;  // false

$s = 0;
echo $s == '' ? 1 : 0;  // true
echo $s === '' ? 1 : 0; // false
echo $s == false ? 1 : 0;  // true
echo $s === false ? 1 : 0; // false

但是在你的情况下,我猜这些线路的余弦并不重要。

$name = 'John Doe';
echo $name == 'John Doe' ? 1 : 0;  // true
echo $name === 'John Doe' ? 1 : 0; // true

答案 4 :(得分:0)

除非您正在检查

的值
  • 一个完整的数值(无论是字符串还是数字)
  • 任何会直接评估为布尔值
  • 的内容

你很高兴与平等运算符本身一起使用。但是,如果你不想被所有这些可能性所困扰,我相信使用严格的相等运算符将是一个更好的选择。

$check = array(
    array(
        'check' => array('01234','1234',01234,1234),
        'against' => array('01234',1234,01234)
    ),
    array(
        'check' => array(0,'0',FALSE,NULL,'',array()),
        'against' => array(FALSE,'')
    ),
    array(
        'check' => array(1,'1',TRUE,'ab',array('a')),
        'against' => array(TRUE,1,'ab')
    )
);

function var2Str($var) {
    if (is_string($var)) return "'$var'";
    elseif (is_bool($var)) return $var ? 'TRUE' : 'FALSE';
    elseif (is_null($var)) return 'NULL';
    elseif (is_array($var)) return 'array('.implode(',',$var).')';
    return $var;
}

foreach ($check as $arr) {
    foreach ($arr['check'] as $ch) {
        $chStr = var2Str($ch);
        foreach ($arr['against'] as $ag) {
            $e1 = $ch == $ag ? 'true' : 'false';
            $e2 = $ch === $ag ? 'true' : 'false';
            echo "$chStr\t==\t" . var2Str($ag) . "\t--> <b>$e1</b>" . PHP_EOL;
            echo "$chStr\t===\t" . var2Str($ag) . "\t--> <b>$e2</b>" . PHP_EOL;
        }
        echo PHP_EOL;
    }
}

检查输出的第二个块中的前两行:

  

'1234'=='01234' - &gt;
  '1234'==='01234' - &gt;