PHP Dokumentation: Oop4 object-comparison
12. Januar 2010 von werner
Comparing objects
In PHP 4, objects are compared in a very simple manner, namely: Two object instances are equal if they have the same attributes and values, and are instances of the same class. Similar rules are applied when comparing two objects using the identity operator (===).
If we were to execute the code in the example below:
Beispiel #1 Example of object comparison in 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);
?>Das oben gezeigte Beispiel erzeugt folgendeAusgabe:
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
Which is the output we will expect to obtain given the comparison rules above. Only instances with the same values for their attributes and from the same class are considered equal and identical.
Even in the cases where we have object composition, the same comparison rules apply. In the example below we create a container class that stores an associative array of Flag objects.
Beispiel #2 Compound object comparisons in 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);
?>Das oben gezeigte Beispiel erzeugt folgendeAusgabe:
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