3个不同的等值


149

是什么区别======

我认为使用一个等号表示变量,而使用两个等号表示比较条件,最后使用三个等号表示比较变量的值。


看看示例...我已经发布了它可以澄清更多的东西..
InfantPro'Aravind'2010年

1
对于高级PHP用户,了解==和===之间的区别并问自己:“当我确定两个操作数是同一类型时,与==或===进行比较会更快吗?”在下面的基准脚本中。
lucaferrario 2013年

@Strawberry我觉得问题的标签也应包含javascript标签,因为它也适用于该语言。
Funk 40 Niner

(更新):我已经在编辑中添加了javascript标记,因为人们=在javascript 中使用的地方有很多问题。这不仅适用于PHP,还适用于其他语言。
Funk 40 Niner

我继续和删除JavaScript代码:这里所有的答案都只有大约PHP(除非这是非常弱的最新的),有之间的语言,如何处理分歧,已经有类似的事实上的规范JavaScript的问题(相当于运算符(== vs ===)应该用于JavaScript比较吗?)。
JJJ

Answers:


172

=赋值操作符==“平等”比较操作===“相同”的比较操作

$a = $b     Assign      Sets $a to be equal to $b.
$a == $b    Equal       TRUE if $a is equal to $b.
$a === $b   Identical   TRUE if $a is equal to $b, and they are of the same type. (introduced in PHP 4)

有关需要==和的详细信息===,以及使用每种情况的信息,请参阅docs


当我比较两个相同的日期时间时,我得到了错误的结果,为什么?例如:sandbox.onlinephpfunctions.com/code/…–
stloc

3
@stloc,===带有对象会告诉您它们是否是同一对象,而不是它们是否具有相同的内容。
安德里亚(Andrea)

在PHP4中引入,在Y2018中很有趣;-)
mvorisek '18

22
  • = 是赋值运算符
  • == 是比较运算符(检查两个变量的值是否相等)
  • === 是相同的比较运算符(检查两个变量是否具有相等的值并且属于同一类型)。

8

=赋值运算符

==检查两个变量是否具有相同的值

===检查两个变量是否具有相同的值,以及它们的类型是否相同


1
也了解两个比较运算符的!=和!=='not'版本。有些语言使用:=作为赋值,只是为了避免这种混淆。
2013年

3

=运算符将值分配给变量$ six = 6; 值6分配给变量$ six

==运算符,检查两个变量的值是否相等,并且主要用于if语句之类的条件

$a = 2;
$b = 2;
if ($a == $b) { 
    echo both variables have the same value; 
}

===类似于==的运算符(检查值是否相等),还检查两个数据类型是否相同

$a = 2;
$b = "2";
if ($a === $b) {
    echo "both variable have same value and of same data type";
} else {
    echo 'both variable is either not equal or not of same data type';
}

//这里$ a是int类型,而$ b是string类型。所以这里的输出


0

对于高级PHP用户,知道之间的差别=====与问自己“是它更快地进行比较==或与===我敢肯定,这两个操作数是相同的类型?”

简短而通用的答案是:在这种情况下使用不会提高性能===,因此您应该使用==

对于有兴趣对其进行基准测试的人,您可以使用下面我临时编写的代码,$a并为and 尝试不同的值$b

<?php
    // CONFIGURATION
    $cycles = 1000000;
    $a = 'random string 1';
    $b = 'random string 2';

    // FUNCTIONS
    function compare_two_equals($a, $b) {
        if ($a == $b) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

    function compare_three_equals($a, $b) {
        if ($a === $b) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

    // EXECUTION
    $time = microtime(TRUE);
    for ($count_a = 0; $count_a < $cycles; $count_a++) {
        compare_two_equals($a, $b);
    }
    $time_two_a = microtime(TRUE) - $time;
    $time = microtime(TRUE);
    for ($count_a = 0; $count_a < $cycles; $count_a++) {
        compare_three_equals($a, $b);
    }
    $time_three_a = microtime(TRUE) - $time;
    $time = microtime(TRUE);
    for ($count_a = 0; $count_a < $cycles; $count_a++) {
        compare_two_equals($a, $b);
    }
    $time_two_b = microtime(TRUE) - $time;
    $time = microtime(TRUE);
    for ($count_a = 0; $count_a < $cycles; $count_a++) {
        compare_three_equals($a, $b);
    }
    $time_three_b = microtime(TRUE) - $time;
    $time = microtime(TRUE);

    // RESULTS PRINTING
    print "<br />\nCOMPARE == (FIRST TRY): " . number_format($time_two_a, 3) . " seconds";
    print "<br />\nCOMPARE == (SECOND TRY): " . number_format($time_two_b, 3) . " seconds";
    print "<br />\nCOMPARE === (FIRST TRY): " . number_format($time_three_a, 3) . " seconds";
    print "<br />\nCOMPARE === (SECOND TRY): " . number_format($time_three_b, 3) . " seconds";
?>

注意:仅当每个“第一尝试”非常接近其“第二尝试”时,该比较才有效。如果它们明显不同,则意味着处理器在执行比较时正忙于做其他事情,因此结果不可靠,应该重新运行基准测试。


9
这样的微基准并不是很可靠。您极不可能担心=====成为性能问题的原因。IMO:最好严格(===),除非您明确希望对==比较比较宽松()。"5 is not a number" == 5异常情况的数量,即可能导致古怪的错误。===永远不会遭受这个问题。
gnarf 2013年

我的测试是告诉程序员,如果===出于性能原因进行选择,那是错误的。因此,程序员可以自由选择,===也可以==基于逻辑原因而不是基于性能原因进行选择:在不同的情况下,一个或另一个更喜欢,并且根本不考虑性能。
lucaferrario '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.