PHP等式(== double equals)和identity(=== triple equals)比较运算符有何不同?

nic*_*ckf 483 php comparison equality operators identity-operator

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

  • 松散的==比较究竟是如何运作的?
  • 严格的===比较究竟是如何运作的?

什么是有用的例子?

nic*_*ckf 611

==和之间的区别===

松散==相等的运算符和严格===相同的运算符之间的区别在手册中有详细解释:

比较运算符

????????????????????????????????????????????????????????????????????????????????????
? Example  ? Name      ? Result                                                    ?
????????????????????????????????????????????????????????????????????????????????????
?$a ==  $b ? Equal     ? TRUE if $a is equal to $b after type juggling.            ?
?$a === $b ? Identical ? TRUE if $a is equal to $b, and they are of the same type. ?
????????????????????????????????????????????????????????????????????????????????????

==比较宽松

如果您正在使用==运算符,或者使用松散比较的任何其他比较运算符!=,<>或者==,您始终必须查看上下文,以查看某些内容转换为什么,在哪里以及为什么要了解正在发生的事情.

转换规则

类型比较表

作为参考和示例,您可以在手册中看到比较表:

松散的比较 ==

?????????????????????????????????????????????????????????????????????????????????????????????????????????????
?         ? TRUE  ? FALSE ?   1   ?   0   ?  -1   ?  "1"  ?  "0"  ? "-1"  ? NULL  ? array() ? "php" ?  ""   ?
?????????????????????????????????????????????????????????????????????????????????????????????????????????????
? TRUE    ? TRUE  ? FALSE ? TRUE  ? FALSE ? TRUE  ? TRUE  ? FALSE ? TRUE  ? FALSE ? FALSE   ? TRUE  ? FALSE ?
? FALSE   ? FALSE ? TRUE  ? FALSE ? TRUE  ? FALSE ? FALSE ? TRUE  ? FALSE ? TRUE  ? TRUE    ? FALSE ? TRUE  ?
? 1       ? TRUE  ? FALSE ? TRUE  ? FALSE ? FALSE ? TRUE  ? FALSE ? FALSE ? FALSE ? FALSE   ? FALSE ? FALSE ?
? 0       ? FALSE ? TRUE  ? FALSE ? TRUE  ? FALSE ? FALSE ? TRUE  ? FALSE ? TRUE  ? FALSE   ? TRUE  ? TRUE  ?
? -1      ? TRUE  ? FALSE ? FALSE ? FALSE ? TRUE  ? FALSE ? FALSE ? TRUE  ? FALSE ? FALSE   ? FALSE ? FALSE ?
? "1"     ? TRUE  ? FALSE ? TRUE  ? FALSE ? FALSE ? TRUE  ? FALSE ? FALSE ? FALSE ? FALSE   ? FALSE ? FALSE ?
? "0"     ? FALSE ? TRUE  ? FALSE ? TRUE  ? FALSE ? FALSE ? TRUE  ? FALSE ? FALSE ? FALSE   ? FALSE ? FALSE ?
? "-1"    ? TRUE  ? FALSE ? FALSE ? FALSE ? TRUE  ? FALSE ? FALSE ? TRUE  ? FALSE ? FALSE   ? FALSE ? FALSE ?
? NULL    ? FALSE ? TRUE  ? FALSE ? TRUE  ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE  ? TRUE    ? FALSE ? TRUE  ?
? array() ? FALSE ? TRUE  ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE  ? TRUE    ? FALSE ? FALSE ?
? "php"   ? TRUE  ? FALSE ? FALSE ? TRUE  ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE   ? TRUE  ? FALSE ?
? ""      ? FALSE ? TRUE  ? FALSE ? TRUE  ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE  ? FALSE   ? FALSE ? TRUE  ?
?????????????????????????????????????????????????????????????????????????????????????????????????????????????

严格===相同的比较

如果您正在使用===运算符或任何其他使用严格比较的比较运算符(如!==或)===,那么您始终可以确保类型不会神奇地改变,因为不会进行转换.因此,通过严格比较,类型和值必须相同,而不仅仅是值.

类型比较表

作为参考和示例,您可以在手册中看到比较表:

严格比较 ===

?????????????????????????????????????????????????????????????????????????????????????????????????????????????
?         ? TRUE  ? FALSE ?   1   ?   0   ?  -1   ?  "1"  ?  "0"  ? "-1"  ? NULL  ? array() ? "php" ?  ""   ?
?????????????????????????????????????????????????????????????????????????????????????????????????????????????
? TRUE    ? TRUE  ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE   ? FALSE ? FALSE ?
? FALSE   ? FALSE ? TRUE  ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE   ? FALSE ? FALSE ?
? 1       ? FALSE ? FALSE ? TRUE  ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE   ? FALSE ? FALSE ?
? 0       ? FALSE ? FALSE ? FALSE ? TRUE  ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE   ? FALSE ? FALSE ?
? -1      ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE  ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE   ? FALSE ? FALSE ?
? "1"     ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE  ? FALSE ? FALSE ? FALSE ? FALSE   ? FALSE ? FALSE ?
? "0"     ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE  ? FALSE ? FALSE ? FALSE   ? FALSE ? FALSE ?
? "-1"    ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE  ? FALSE ? FALSE   ? FALSE ? FALSE ?
? NULL    ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE  ? FALSE   ? FALSE ? FALSE ?
? array() ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? TRUE    ? FALSE ? FALSE ?
? "php"   ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE   ? TRUE  ? FALSE ?
? ""      ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE ? FALSE   ? FALSE ? TRUE  ?
?????????????????????????????????????????????????????????????????????????????????????????????????????????????

  • 有没有人觉得奇怪"000"=="0000"? (63认同)
  • 这在Javascript,顺便说一下大致相同. (61认同)
  • 总是让我感到惊讶的是false == array(),false == 0但是array()!= 0,所以false == array()!=/== 0?这对我来说很奇怪. (35认同)
  • @Raithlin,还有很多陷阱.**在JavaScript中:**`"000"!="00"`,`"000"== null`,""000"== false`,""0x0"== false`,`array()= = 0`,`false!= null`,`array()!= null`,`false =="0x0"`,`false =="000"`.**在PHP中,它的行为相反:**""000"=="00"`,""000"!= null`,""000"!= false`,""0x0"!= false`,` array()!= 0`,`false == null`,`array()== null`,`false!="0x0"`,`false!="000"`. (14认同)
  • @Raithlin,小心阵.对于PHP中的不同数组,三等于给出`false`,但对于PHP,只要它们的值等于*,就为`true`. (12认同)
  • @Pim ...继续:以这种方式看待它:投射到BOOL,任何值只需要落在两个方面之一,"true"或"false".这很容易施展.出于所有实际目的,所有其他值虽然具有几乎无限的组合.是"五"== 5`?`array(0)== 0`?`array(0,0,0)== 0`?`0.0000000000000000000000000000000000000000000000000001 == array()`? (4认同)
  • 那个空字符串怎么样?''` 我很乐意看到这个增加到这个非常有用的桌子!:-) (3认同)
  • 也许在比较之前将看起来像数字的字符串转换为数字,如果这是真的,则000 == 0000是有意义的. (2认同)

Pat*_*ien 237

如果运算符不同,则运算符==在两种不同类型之间进行转换,而===运算符执行"类型安全比较".这意味着如果两个操作数具有相同的类型和相同的值,它将仅返回true.

例子:

1 === 1: true
1 == 1: true
1 === "1": false // 1 is an integer, "1" is a string
1 == "1": true // "1" gets casted to an integer, which is 1
"foo" === "foo": true // both operands are strings and have the same value
Run Code Online (Sandbox Code Playgroud)

警告:具有等效成员的同一类的两个实例与===运算符不匹配.例:

$a = new stdClass();
$a->foo = "bar";
$b = clone $a;
var_dump($a === $b); // bool(false)
Run Code Online (Sandbox Code Playgroud)

  • Nitpick:===只有两个操作数都是相同的_并且值为equal_ =时才返回true (3认同)
  • 使用PHP 8年后,昨天是我第一次遇到我应该使用===的情况 (3认同)
  • ===如果它们相等且类型相同,则为true.==如果他们是平等的,则为真.!=如果不相等则为真.!==如果它们不相等,或者相同但类型不同,则为真. (3认同)

Eri*_*ski 79

一张图片胜过千言万语:

PHP双等于==平等图:

在此输入图像描述

PHP Triple Equals ===Equality图表:

在此输入图像描述

创建这些图像的源代码:

https://github.com/sentientmachine/php_equality_charts

大师冥想

那些希望保持理智的人,不要再读了.

  1. NAN != NAN尽可能将左右操作数转换为数字NAN == true,但是==
  2. 引号中的十六进制字符串偶尔会浮动,并将根据您的意愿转换为它.
  3. 123 == "123foo"是不可传递的,因为"123" != "123foo",==但是"0"== 0
  4. 0 == "","0" != ""和,=="6" == " 6"因为"4.2" == "4.20"是八进制.但"133" == "0133"133 != 0133
  5. 尚未声明的PHP变量为false.

  6. "0x10" == "16","1e3" == "1000",False == 0"".

  7. 当数字足够大时,它们是==无穷大.
  8. NAN不= =自己,但它是真的.
  9. 一个新的类是==到1.
  10. False是最危险的值,因为对于大多数其他变量,False ==,大多数都是为了挫败它的目的.

希望:

如果您使用PHP,则不应使用double equals运算符,始终使用triple equals.

  • 是的,三等于它的传递属性使它更安全和网络规模. (3认同)
  • 特别是 `1.0 !== 1` 可能有点麻烦,例如 `floor(4 / 3) === 1 ?'按预期工作':'什么?'` (2认同)

小智 39

关于JavaScript:

===运算符与==运算符的作用相同,但它要求其操作数不仅具有相同的值,而且还具有相同的数据类型.

例如,下面的示例将显示'x和y相等',但不是'x和y相同'.

var x = 4;
var y = '4';
if (x == y) {
    alert('x and y are equal');
}
if (x === y) {
    alert('x and y are identical');
}
Run Code Online (Sandbox Code Playgroud)


sou*_*rge 22

关于对象比较的其他答案的补充:

==使用对象的名称及其值来比较对象.如果两个对象具有相同的类型且具有相同的成员值,则$a == $b产生true.

===比较对象的内部对象id.即使成员是平等的,$a !== $b如果它们不是完全相同的对象.

class TestClassA {
    public $a;
}

class TestClassB {
    public $a;
}

$a1 = new TestClassA();
$a2 = new TestClassA();
$b = new TestClassB();

$a1->a = 10;
$a2->a = 10;
$b->a = 10;

$a1 == $a1;
$a1 == $a2;  // Same members
$a1 != $b;   // Different classes

$a1 === $a1;
$a1 !== $a2; // Not the same object
Run Code Online (Sandbox Code Playgroud)


sil*_*ver 12

简单来说:

==检查是否等效(仅限值)

===检查是否相同(值&&类型)


等价与相同:类比

1 + 1 = 2 + 0(相当于)

1 + 1 = 1 + 1(相同)


在PHP中:

true == 1(true - 等值)

true === 1(false - 值&&类型不一样)

  • true是布尔值
  • 1是int


小智 8

这都是关于数据类型的.以BOOL(真或假)为例:

true也等于1, false也等于0

==比较时,并不关心数据类型:所以,如果你有一个变量,它是1(也可能是true):

$var=1;

然后比较==:

if ($var == true)
{
    echo"var is true";
}
Run Code Online (Sandbox Code Playgroud)

$var实际上并不相同true,是吗?它具有1相反的int值,而int值又等于true.

使用===,检查数据类型以确保两个变量/对象/使用相同类型的任何内容.

所以,如果我这样做

if ($var === true)
{
    echo "var is true";
}
Run Code Online (Sandbox Code Playgroud)

这种情况不会是真的,因为$var !== true它只是== true(如果你知道我的意思).

你为什么需要这个?

简单 - 让我们来看看PHP的一个功能array_search():

array_search()函数只是在数组中搜索一个值,并返回找到该值的元素的键.如果在数组中找不到该值,则返回false.但是,如果你array_search()对存储在数组第一个元素中的值(它将具有数组键0)进行了操作,array_search()那么该函数将返回0 ...等于false.

所以,如果你这样做:

$arr = array("name");
if (array_search("name", $arr) == false)
{
    // This would return 0 (the key of the element the val was found
    // in), but because we're using ==, we'll think the function
    // actually returned false...when it didn't.
}
Run Code Online (Sandbox Code Playgroud)

所以,你现在看到这可能是一个问题吗?

大多数人== false在检查函数是否返回false时不使用.相反,他们使用!.但实际上,这与使用完全相同==false,所以如果你这样做:

$arr = array("name");
if (!array_search("name", $arr)) // This is the same as doing (array_search("name", $arr) == false)
Run Code Online (Sandbox Code Playgroud)

所以对于这样的事情,你会使用===而不是,以便检查数据类型.


fic*_*489 8

一个例子是数据库属性可以为null或"":

$attributeFromArray = "";
if ($attributeFromArray ==  ""){}  //true
if ($attributeFromArray === ""){}  //true
if ($attributeFromArray ==  null){}  //true
if ($attributeFromArray === null){}  //false

$attributeFromArray = null;
if ($attributeFromArray ==  ""){}  //true
if ($attributeFromArray === ""){}  //false
if ($attributeFromArray ==  null){}  //true
if ($attributeFromArray === null){}  //true
Run Code Online (Sandbox Code Playgroud)


Man*_*ghi 6

特定 x = 5

1)运算符:=="等于".x == 8是假的
2)运算符:==="完全等于"(值和类型)x === 5为真,x === "5"为假