Forum und email

Συγκρίνοντας αντικείμενα στην PHP 4

Στην PHP 4, τα αντικείμενα συγκρίνονται σε έναν πολύ απλό τρόπο, δηλαδή: δυο στιγμιότυπα αντικειμένων είναι ίσα αν έχουν τις ίδιες τιμές και τα ίδια attributes, και είναι στιγμιότυπα της ίδιας κλάσης. Παρόμοιοι κανόνες εφαρμόζονται όταν συγκρίνονται δυο αντικείμενα χρησιμοποιώντας τον τελεστή ταυτότητας (===).

Αν είχαμε να εκτελέσουμε τον κώδικα στο παρακάτω παράδειγμα:

Example#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 αντικείμενα.

Example#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