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

=====什麼區別?

  • 鬆散==比較工作到底如何?
  • 嚴格===比較是如何工作的?

什麼是一些有用的例子?




$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...
}



幾個例子

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!');
}



一張圖片勝過千言萬語:

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。




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



===運算符應該比較確切的內容相等,而==運算符則會比較語義相等。 特別是它將強製字符串數字。

平等是一個很大的課題。 請參閱維基百科關於平等的文章