最近更新: 2006-12-12

Equal (==) and Identical(===) in PHP

php_syntax

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 。

樂多舊網址: http://blog.roodo.com/rocksaying/archives/2565180.html