PHP 5 中的對象比較要比 PHP 4 中複雜,所期望的結果更符合一個物件導向語言。
當使用比較子(==)比較兩個物件變數時,比較的原則是:如果兩個對象的屬性和屬性值 都相等,而且兩個對象是同一個類的執行個體,那麼這兩個物件變數相等。
而如果使用全等運算子(===),這兩個物件變數一定要指向某個類的同一個執行個體(即同一個對象)。
通過下面的樣本可以理解以上原則。
Example #1 PHP 5 的對象比較
<?phpfunction bool2str($bool){ if ($bool === false) { return 'FALSE'; } else { return 'TRUE'; }}function compareObjects(&$o1, &$o2){ echo 'o1 == o2 : ' . bool2str($o1 == $o2) . "\n"; echo 'o1 != o2 : ' . bool2str($o1 != $o2) . "\n"; echo 'o1 === o2 : ' . bool2str($o1 === $o2) . "\n"; echo 'o1 !== o2 : ' . bool2str($o1 !== $o2) . "\n";}class Flag{ public $flag; function Flag($flag = true) { $this->flag = $flag; }}class OtherFlag{ public $flag; function OtherFlag($flag = true) { $this->flag = $flag; }}$o = new Flag();$p = new Flag();$q = $o;$r = new OtherFlag();echo "Two instances of the same class\n";compareObjects($o, $p);echo "\nTwo references to the same instance\n";compareObjects($o, $q);echo "\nInstances of two different classes\n";compareObjects($o, $r);?>
以上常式會輸出:
Two instances of the same classo1 == o2 : TRUEo1 != o2 : FALSEo1 === o2 : FALSEo1 !== o2 : TRUETwo references to the same instanceo1 == o2 : TRUEo1 != o2 : FALSEo1 === o2 : TRUEo1 !== o2 : FALSEInstances of two different classeso1 == o2 : FALSEo1 != o2 : TRUEo1 === o2 : FALSEo1 !== o2 : TRUE
Note:
PHP 擴充中可以自行定義對象比較的原則。