Forum und email

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

Warning

Αυτή η επέκταση είναι ΔΟΚΙΜΑΣΤΙΚΗ. Η συμπεριφορά της -- συμπεριλαμβανομένου και του ονόματος των συναρτήσεων της και οτιδήποτε άλλο είναι τεκμηριωμένο σχετικά με αυτή την επέκταση -- μπορεί να αλλάξει χωρίς ειδοποίηση σε μελλοντικές εκδόσεις της PHP. Χρησιμοποιήστε αυτή την επέκταση με δικό σας ρίσκο.

Στην PHP 5, η σύγκριση αντικειμένων είναι πιο περίπλοκη απ'οτι στην PHP 4 και περισσότερο σε συμφωνία με αυτό που θα περιμένει από μια αντικειμενοστραφή γλώσσα. (όχι ότι η PHP 5 είναι μια τέτοια γλώσσα).

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

Από την άλλη, όταν χρησιμοποιείται ο τελεστής ταυτότητας (===), οι μεταβλητές αντικειμένων είναι όμοιες μόνο και μόνο αν αναφέρονται στο ίδιο στιγμιότυπο της ίδιας κλάσης (σε ένα ιδιαίτερο namespace).

Ένα παράδειγμα θα ξεκαθαρίσει αυτούς τους κανόνες.

Example#1 Παράδειγμα σύγκρισης αντικειμένων στην PHP 5

<?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;
    }
}

namespace Other {

    class 
Flag {
        var 
$flag;

        function 
Flag($flag=true) {
                
$this->flag $flag;
        }
    }

}

$o = new Flag();
$p = new Flag();
$q $o;
$r = new Other::Flag();

echo 
"Two instances of the same class\n";
compareObjects($o$p);

echo 
"\nTwo references to the same instance\n";
compareObjects($o$q);

echo 
"\nInstances of similarly named classes in different namespaces\n";
compareObjects($o$r);
?>
Το παράδειγμα θα έχει ως αποτέλεσμα:
Two instances of the same class
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : FALSE
o1 !== o2 : TRUE

Two references to the same instance
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : TRUE
o1 !== o2 : FALSE

Instances of similarly named classes in different namespaces
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE