7

举个例子,应该是$name == "John Doe"还是$name === "John Doe"

我猜想相等比较的表现会更差,因为它们会进行某种类型转换。

ps 我知道选择一个而不是另一个的性能增益可以忽略不计,如果有的话。这是一个原则问题。

4

5 回答 5

3

如果您仔细接受您没有使用强类型语言的事实,那么您实际上不需要在大多数代码中检查 === ,但是当您编写 PHP 代码时,这应该是一个不变的想法。

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

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

$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
于 2013-01-22T16:40:36.513 回答
1

我总是选择最严格的,前提是我可以防止在未来的变化中出现一些逻辑错误,否则这些错误不会被发现。我还没有对那个程序感到难过。

于 2013-01-22T16:41:42.180 回答
0

===type除了平等之外,还检查。这是比较运算符的手册。

正如评论中提到的,我编辑了我的答案,

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

于 2013-01-22T16:39:24.437 回答
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;
    }
}

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

'1234' == '01234' -->
'1234' === '01234' -->

于 2013-01-22T19:24:37.390 回答
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
于 2013-01-22T17:39:25.580 回答