Μετάδοση αντικειμένων με αναφορά στην αντικειμενοστρεφή προγραμματισμό στην PHP
Ας υποθέσουμε ότι έχουμε την ακόλουθη κλάση User:
<?php
class User
{
public $name;
public $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Ας υποθέσουμε ότι δημιουργούμε ένα αντικείμενο αυτής της κλάσης:
<?php
$user = new User('john', 30);
?>
Φανταστείτε τώρα την ακόλουθη κατάσταση: θέλετε
να αντιγράψετε την τιμή της μεταβλητής $user
σε κάποια άλλη μεταβλητή, για παράδειγμα
$test.
Εάν δεν μιλούσαμε για αντικείμενα, αλλά για πρωτογενείς τύπους,
δηλαδή για συμβολοσειρές, αριθμούς, πίνακες κ.λπ,
τότε στη μεταβλητή $test θα εισερχόταν αντίγραφο
της τιμής της μεταβλητής $user.
Αυτό σημαίνει ότι οι αλλαγές σε οποιαδήποτε από τις μεταβλητές στο μέλλον δεν θα άλλαζαν την τιμή της άλλης μεταβλητής. Ας δούμε ένα παράδειγμα:
<?php
$user = 1;
$test = $user; // στη μεταβλητή $test τώρα υπάρχει 1
$test = 2; // στη μεταβλητή $test τώρα υπάρχει 2, ενώ στη $user - ακόμα 1
?>
Με τα αντικείμενα είναι διαφορετικά - κατά την εγγραφή σε άλλη μεταβλητή τα αντικείμενα δεν αντιγράφονται, αλλά μεταδίδονται με αναφορά: αυτό σημαίνει ότι και οι δύο αυτές μεταβλητές έχουν ως τιμή το ίδιο αντικείμενο. Αυτό έχει σημαντική συνέπεια: εάν αλλάξετε ορισμένες ιδιότητες του αντικειμένου χρησιμοποιώντας μια μεταβλητή, στη δεύτερη μεταβλητή θα εμφανιστούν οι ίδιες αλλαγές.
Ας δούμε στην πράξη. Δημιουργήστε ένα αντικείμενο χρήστη:
<?php
$user = new User('john', 30);
?>
Αντιγράψτε το αντικείμενο σε άλλη μεταβλητή:
<?php
$test = $user;
?>
Αλλάξτε την ιδιότητα name
στη μεταβλητή $test
<?php
$test->name = 'eric';
?>
Ας ελέγξουμε ότι άλλαξε το κοινό αντικείμενο.
Εμφανίστε την ιδιότητα name
από τη μεταβλητή $user:
<?php
echo $user->name; // θα εμφανίσει 'eric'!
?>
Δημιουργήστε την κλάση Product, στην οποία
θα υπάρχουν οι ακόλουθες ιδιότητες: name,
price.
Δημιουργήστε ένα αντικείμενο της κλάσης Product, καταγράψτε
το στη μεταβλητή $product1.
Αντιγράψτε την τιμή της μεταβλητής $product1
στη μεταβλητή $product2. Ελέγξτε
ότι και οι δύο μεταβλητές αναφέρονται στο ίδιο
αντικείμενο.