對象比較
在 php 4 中,對象比較的規則十分簡單:如果兩個對象是同一個類的實例,且它們有相同的屬性和值,則這兩個對象相等。類似的規則還適用與用全等符(===)對兩個對象的比較 。
範例代碼
對象比較
<?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 { var $flag; function Flag($flag=true) { $this->flag = $flag; }}class SwitchableFlag extends Flag { function turnOn() { $this->flag = true; } function turnOff() { $this->flag = false; }}$o = new Flag();$p = new Flag(false);$q = new Flag();$r = new SwitchableFlag();echo "Compare instances created with the same parameters/n";compareObjects($o, $q);echo "/nCompare instances created with different parameters/n";compareObjects($o, $p);echo "/nCompare an instance of a parent class with one from a subclass/n";compareObjects($o, $r);?>上例將輸出:
Compare instances created with the same parameterso1 == o2 : TRUEo1 != o2 : FALSEo1 === o2 : TRUEo1 !== o2 : FALSECompare instances created with different parameterso1 == o2 : FALSEo1 != o2 : TRUEo1 === o2 : FALSEo1 !== o2 : TRUECompare an instance of a parent class with one from a subclasso1 == o2 : FALSEo1 != o2 : TRUEo1 === o2 : FALSEo1 !== o2 : TRUE |
這和按照比較規則推測的結果一致。若且唯若出自同一個類且屬性及其值都相同的對象被認為是相等且完全相同的。
即使對於具有對象成分的類,比較的規則也相同。在以下的範例中建立了一個容器類來儲存 Flag 對象的一個相關數組。
複合比較
<?phpclass FlagSet { var $set; function FlagSet($flagArr = array()) { $this->set = $flagArr; } function addFlag($name, $flag) { $this->set[$name] = $flag; } function removeFlag($name) { if (array_key_exists($name, $this->set)) { unset($this->set[$name]); } }}$u = new FlagSet();$u->addFlag('flag1', $o);$u->addFlag('flag2', $p);$v = new FlagSet(array('flag1'=>$q, 'flag2'=>$p));$w = new FlagSet(array('flag1'=>$q));echo "/nComposite objects u(o,p) and v(q,p)/n";compareObjects($u, $v);echo "/nu(o,p) and w(q)/n";compareObjects($u, $w);?>上例將輸出:
Composite objects u(o,p) and v(q,p)o1 == o2 : TRUEo1 != o2 : FALSEo1 === o2 : TRUEo1 !== o2 : FALSEu(o,p) and w(q)o1 == o2 : FALSEo1 != o2 : TRUEo1 === o2 : FALSEo1 !== o2 : TRUE |