Equal (==) and Identical(===) in PHP
PHP 的比較算符中 (Comparison Operators) 提供了兩種相等算符,一為 Equal 算符(==
),另一為 Identical 算符 (===
)。這兩種算符是因應 PHP 的型態彈性 (或稱動態型) 而設置,其差異在於 Equal 算符會自動轉換兩側變數的型態,而 Identical 算符不會轉換型態,因此 Identical 算符要求值以及型態皆相等才為 True
。
PHP 的 Equal 算符具有型態轉換的動態特性,當變數的型態不為 bool
時會自動轉換型態後再進行相等運算。然而,一來型態轉換的動作有時會增加不必要的程式執行動作;二來某些情況下,型態差異是有意義的,不應該視為相等。例如自資料庫中讀取一個欄位值,這個欄位值可能是 0 ,也可能是 Null 。在資料庫系統中,這兩者顯然不應視為相等,但對 Equal 算符而言, 0 與 Null 相等。如此便產生語意不清的困擾,此時便需要使用會抑止型態轉換的 Identical 算符進行比較,同時也會帶來執行速度較佳的好處。
基本上, PHP 的 Equal 算符 (==
) 沿續 C 語言的傳統,認為非零的值皆為 True
,零值為 False
,而 Null
也一向被認為是零的等義值,字串指向非 Null 的記憶位址,所以會被視為非零值。據此猜想可以寫出下列的測試程式。
<?php $vs = array( 'bool true' => true, 'string "true"' => 'true', 'string "t"' => 't', 'int 1' => 1, 'string "1"' => '1', 'int -2' => -2, 'string "-2"' => '-2', 'int 0' => 0, 'string "0"' => '0', 'empty string' => '', 'bool false' => false, 'string "false"'=> 'false', 'string "f"' => 'f', 'null' => null ); echo "\nEqual operator test:\n"; foreach ($vs as $t => $v) { if ($v == true): echo "{$t} is equal to true\n"; else: echo "{$t} is equal to false\n"; endif; } echo "\nIdentical operator test:\n"; foreach ($vs as $t => $v) { if ($v === true): echo "{$t} is identical to true\n"; else: echo "{$t} is identical to false\n"; endif; } ?>
記錄上列程式的結果應該就可掌握 Equal 算符與 Identical 算符的差異。比較特殊的是字串 '0' 和空字串 '' 的測試結果。當字串為空字串時, PHP 視為 Null 的等義值,故結果為 False 。接著 PHP 會再試著將字串轉換為數值,所以字串 '0' 被轉換為零值而為 False 。至於字串 'false' 則純粹被視為一個非空且無法轉換為數值的字串,不會被轉換成 bool 型態的 false ,故仍為 True 。