Συγκρίνοντας αντικείμενα στην PHP 5
Αυτή η επέκταση είναι ΔΟΚΙΜΑΣΤΙΚΗ. Η συμπεριφορά της -- συμπεριλαμβανομένου και του ονόματος των συναρτήσεων της και οτιδήποτε άλλο είναι τεκμηριωμένο σχετικά με αυτή την επέκταση -- μπορεί να αλλάξει χωρίς ειδοποίηση σε μελλοντικές εκδόσεις της 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