首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP === 全等運算子深度解析:基本型別、物件比較、常見誤區

     編輯:PHP 綜合知識

===(全等)同時比較值與型別,不進行型別轉換。==(相等)會嘗試型別轉換後比較。本文詳細解析標量、陣列、物件、NULL、資源等各類型的比較行為。

基本型別比較表

運算式=== 結果== 結果說明
123 === 123truetrue同型同值
123 === '123'falsetrueint vs string
0 === falsefalsetrueint vs bool
'' === falsefalsetruestring vs bool
null === falsefalsetruenull vs bool
'0' === 0falsetruestring vs int
[] === []truetrue空陣列
[1] === [1]truetrue索引陣列同序同值
['a'=>1] === ['a'=>1]truetrue關聯陣列同鍵同值同序
[1,2] === [2,1]falsefalse順序不同

物件比較:=== vs ==

<?php
class Person {
    public string $name;
    public function __construct(string $name) { $this->name = $name; }
}

$p1 = new Person('Alice');
$p2 = new Person('Alice');
$p3 = $p1;

var_dump($p1 === $p2); // false:不同實例
var_dump($p1 == $p2);  // true:屬性值相同、同類別
var_dump($p1 === $p3); // true:同一實例(引用)
var_dump($p1 == $p3);  // true
?>
  • ===:同一實例(記憶體位址相同)。
  • ==:同類別且所有屬性值相等(遞歸比較)。

特殊值比較

<?php
// NULL
var_dump(null === null); // true
var_dump(null === false); // false

// 資源
$fp1 = fopen('php://memory', 'r');
$fp2 = fopen('php://memory', 'r');
var_dump($fp1 === $fp2); // false:不同資源
var_dump($fp1 == $fp2);  // false:資源不支援 == 比較(PHP 8.1+ 拋出 TypeError)

// NaN
var_dump(NAN === NAN); // false(IEEE 754 規定 NaN != NaN)
var_dump(NAN == NAN);  // false

常見誤區與最佳實踐

  1. 表單輸入永遠是字串:$_POST['age'] === 18 永遠 false,需 (int)$_POST['age'] === 18 或 $_POST['age'] == 18。
  2. 資料庫查詢結果:PDO 預設返回字串,$row['id'] === 1 可能 false,建議 PDO::ATTR_STRINGIFY_FETCHES => false + PDO::ATTR_EMULATE_PREPARES => false 獲得原生型別。
  3. 配置檔解析:parse_ini_file 返回字串,嚴格比較需轉型。
  4. 快取檢查:$cache->get('key') === false 區分「快取未命中」vs「快取值為 false」。
  5. 嚴格比較習慣:除非確定需要型別轉換,預設用 ===,減少隱性 Bug。

結語

=== 是「值+型別」雙重保障。理解各型別比較語義,養成預設用 ===、只在確需轉換時用 == 的習慣,能消除一大類難以重現的邏輯 Bug。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved