3种不同的等于符号

160

======之间有什么区别?

我认为,使用单个等号是用来声明变量的,而双等号用于比较条件,最后三个等号用于比较已声明变量的值。


请查看我发布的示例,它会更清楚地说明问题。 - Rookie Programmer Aravind
1
对于高级 PHP 用户来说,了解 == 和 === 之间的区别,并且问自己“当我确定两个操作数是相同类型时,使用 == 还是 === 进行比较更快?”请查看下面我的基准测试脚本。 - lucaferrario
@Strawberry 我认为这个问题的标签也应该包括 javascript 标签,因为它同样适用于这种语言。 - Funk Forty Niner
(更新):我已经在编辑中添加了JavaScript标签,因为有很多问题是关于人们在JavaScript中使用=的。这不仅适用于PHP,还适用于其他语言。 - Funk Forty Niner
我已经删除了JavaScript标签:这里所有的答案都只涉及PHP(除了最新的一个非常薄弱的回答),两种语言处理方式确实存在差异,并且已经有了类似的事实上的JavaScript规范问题(在JavaScript比较中应该使用哪个等号运算符(== vs ===)?)。 - JJJ
5个回答

179

你有=赋值运算符,==等于比较运算符和===恒等比较运算符。

$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)

更多关于使用=====的必要性以及在哪些情况下使用每个操作符,可以参考文档


当我比较两个相同的日期时间时,为什么会得到错误的结果?例如:http://sandbox.onlinephpfunctions.com/code/aef1451396f26fd6f8b623c4bb676f508c938006 - stloc
4
在使用 === 比较对象时,它会告诉你这些对象是否是同一个对象,而不是它们是否具有相同的内容。 - Andrea
在PHP4中引入,2018年仍然有趣;-) - mvorisek

23
  • = 是赋值运算符
  • == 是比较运算符(检查两个变量是否具有相等的值)
  • === 是严格比较运算符(检查两个变量是否具有相等的值和相同的类型)。

9

= 赋值运算符

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

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


1
还要了解 != 和 !== 两个比较运算符的 'not' 版本。一些语言使用 := 作为赋值,只是为了避免这种混淆。 - Phil Perry

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$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
像这样的微基准测试并不是很可靠。而且,你很可能永远不会担心 ===== 是导致性能问题的原因。在我看来:除非你明确想要进行宽松的比较(==),否则最好严格使用 (===)。许多奇怪的特殊情况(例如 "5不是数字" == 5)可能会导致奇怪的错误。===从不受此问题困扰。 - gnarf
我的测试是告诉程序员,如果他们因为性能原因选择===,那么他们是错误的。因此,程序员可以根据逻辑原因自由选择=====,但不能基于性能原因:有不同的情况可以优先选择其中一个,而性能绝不能考虑在内。 - lucaferrario

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接