对象的比较

在 PHP 4 中,对象比较的规则十分简单:如果两个对象是同一个类的实例,且它们有相同的属性和值,则这两个对象相等。类似的规则还适用与用全等符(===)对两个对象的比较。

如果执行以下范例中的代码:

例 9.1. PHP 4 中对象比较范例

<?php
function 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 parameters
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : TRUE
o1 !== o2 : FALSE

Compare instances created with different parameters
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE

Compare an instance of a parent class with one from a subclass
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE

这和按照比较规则推测的结果一致。当且仅当出自同一个类且属性及其值都相同的对象被认为是相等且完全相同的。

即使对于具有对象成分的类,比较的规则也相同。在以下的范例中建立了一个容器类来储存 Flag 对象的一个相关数组。

例 9.2. PHP 4 中复合对象的比较

<?php
class 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 : TRUE
o1 != o2 : FALSE
o1 === o2 : TRUE
o1 !== o2 : FALSE

u(o,p) and w(q)
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE