PHP等式(== double等于)和identity(=== triple等于)比较运算符有什么不同?


Answers

运算符==在两种不同类型之间转换,而===运算符则执行“类型安全比较”。 这意味着只有当两个操作数具有相同的类型和相同的值时才会返回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

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

$a = new stdClass();
$a->foo = "bar";
$b = clone $a;
var_dump($a === $b); // bool(false)
Question

=====什么区别?

  • 松散==比较工作到底如何?
  • 严格===比较是如何工作的?

什么是一些有用的例子?




一张图片胜过千言万语:

PHP双等于==相等图:

PHP三重等于===平等图表:

源代码来创建这些图像:

https://github.com/sentientmachine/php_equality_charts

Guru冥想

那些希望保持清醒的人,不要再读了。

  1. '=='将左右操作数转换为数字(123 ==“123foo”,但是“123”!=“123foo”
  2. 用引号括起来的十六进制字符串有时候是一个浮点数,并且会根据您的意愿进行转换。
  3. ==不是传递的,因为(“0”是== 0,0是==“”,而是“0”!=“”)
  4. “6”==“6”,“4.2”==“4.20”和“133”==“0133”。 但是133!= 0133,因为0133是八进制。 但是“0x10”==“16”和“1e3”==“1000”
  5. 尚未声明的PHP变量是错误的。

  6. False等于0,空白字符串和空数组以及“0”。

  7. 当数字足够大,他们是==无穷大。
  8. NAN本身不==,但它是真的。

  9. 新鲜的类是==到1。

  10. 虚假是最危险的价值,因为虚假是大部分其他变数,大多数是击败它的目的。

希望:

如果你使用PHP,你不应该使用double equals运算符,而总是使用triple equals。




===运算符应该比较确切的内容相等,而==运算符会比较语义相等。 特别是它将强制字符串数字。

平等是一个很大的课题。 请参阅维基百科关于平等的文章




几个例子

var_dump(5 == 5);    // True
var_dump(5 == "5");  // True because == checks only same value not type
var_dump(5 === 5);   // True
var_dump(5 === "5"); // False because value are same but data type are different.

PS

==只比较值,不会打扰数据类型

===比较值和数据类型




至于何时使用另一个,例如PHP中的fwrite()函数。

此函数将内容写入文件流。 根据PHP,“ fwrite()返回写入的字节数,错误时返回FALSE”。 如果要测试函数调用是否成功,则此方法有缺陷:

if (!fwrite(stuff))
{
    log('error!');
}

它可以返回零(并被认为是成功的),并且你的状态仍然被触发。 正确的方法是:

if (fwrite(stuff) === FALSE)
{
    log('error!');
}



$a = 5;   // 5 as an integer

var_dump($a == 5);       // compare value; return true
var_dump($a == '5');     // compare value (ignore type); return true
var_dump($a === 5);      // compare type/value (integer vs. integer); return true
var_dump($a === '5');    // compare type/value (integer vs. string); return false

不过要小心。 这是一个臭名昭着的问题。

// 'test' is found at position 0, which is interpreted as the boolean 'false'
if (strpos('testing', 'test')) {
    // code...
}

// true, as strict comparison was made (0 !== false)
if (strpos('testing', 'test') !== false) {
    // code...
}



PHP是一种松散类型的语言。 使用双等号运算符可以对变量进行松散的检查。

松散地检查一个值将允许一些类似但不相等的值相同:

  • “”
  • 空值
  • 0

所有这些值将等于使用双等号运算符。




一个例子是数据库属性可以是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



最简单的说法是:

==检查是否等价 (只有值)

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


等值对相同:一个类比

1 + 1 = 2 + 0 (等同)

1 + 1 = 1 + 1 (相同)


在PHP中:

true == 1 (true - 等价值)

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

  • true是布尔值
  • 1是int





Related