Στην PHP 4, τα αντικείμενα συγκρίνονται σε έναν πολύ απλό τρόπο, δηλαδή: δυο στιγμιότυπα
αντικειμένων είναι ίσα αν έχουν τις ίδιες τιμές και τα ίδια attributes, και είναι
στιγμιότυπα της ίδιας κλάσης. Παρόμοιοι κανόνες εφαρμόζονται όταν συγκρίνονται δυο
αντικείμενα χρησιμοποιώντας τον τελεστή ταυτότητας (===).
Αν είχαμε να εκτελέσουμε τον κώδικα στο παρακάτω παράδειγμα:
ÐáñÜäåéãìá 18-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 |
το οποίο είναι το αποτέλεσμα που προσδοκούμε να πάρουμε βάσει των παραπάνω
κανόνων σύγκρισης. Μόνο στιγμιότυπα με τις ίδιες τιμές για τα attributes τους και από τις
ίδιες κλάσεις θεωρούνται ίσα και όμοια.
Ακόμη και στις περιπτώσεις όπου έχουμε σύνθεση αντικειμένου, οι ίδιοι κανόνες
σύγκρισης εφαρμόζονται. Στο παρακάτω παράδειγμα δημιουργούμε μια container κλάση η οποία
αποθηκεύει έναν associative πίνακα από Flag αντικείμενα.
ÐáñÜäåéãìá 18-2. Compound συγκρίσεις αντικειμένων στην PHP 44
<?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 |