Μετάδοση αντικειμένων με αναφορά στην αντικειμενοστρεφή προγραμματισμό στην PHP

Ας υποθέσουμε ότι έχουμε την ακόλουθη κλάση User:

User.php<?php
  class User
  {
    public $name;
    public $age;
    
    public function __construct($name, $age)
    {
      $this->name = $name;
      $this->age  = $age;
    }
  }
?>

Ας υποθέσουμε ότι δημιουργούμε ένα αντικείμενο αυτής της κλάσης:

index.php<?php
  $user = new User('john', 30);
?>

Φανταστείτε τώρα την ακόλουθη κατάσταση: θέλετε να αντιγράψετε την τιμή της μεταβλητής $user σε κάποια άλλη μεταβλητή, για παράδειγμα $test.

Εάν δεν μιλούσαμε για αντικείμενα, αλλά για πρωτογενείς τύπους, δηλαδή για συμβολοσειρές, αριθμούς, πίνακες κ.λπ, τότε στη μεταβλητή $test θα εισερχόταν αντίγραφο της τιμής της μεταβλητής $user.

Αυτό σημαίνει ότι οι αλλαγές σε οποιαδήποτε από τις μεταβλητές στο μέλλον δεν θα άλλαζαν την τιμή της άλλης μεταβλητής. Ας δούμε ένα παράδειγμα:

index.php<?php
  $user = 1;
  
  $test = $user; // στη μεταβλητή $test τώρα υπάρχει 1
  $test = 2;     // στη μεταβλητή $test τώρα υπάρχει 2, ενώ στη $user - ακόμα 1
?>

Με τα αντικείμενα είναι διαφορετικά - κατά την εγγραφή σε άλλη μεταβλητή τα αντικείμενα δεν αντιγράφονται, αλλά μεταδίδονται με αναφορά: αυτό σημαίνει ότι και οι δύο αυτές μεταβλητές έχουν ως τιμή το ίδιο αντικείμενο. Αυτό έχει σημαντική συνέπεια: εάν αλλάξετε ορισμένες ιδιότητες του αντικειμένου χρησιμοποιώντας μια μεταβλητή, στη δεύτερη μεταβλητή θα εμφανιστούν οι ίδιες αλλαγές.

Ας δούμε στην πράξη. Δημιουργήστε ένα αντικείμενο χρήστη:

index.php<?php
  $user = new User('john', 30);
?>

Αντιγράψτε το αντικείμενο σε άλλη μεταβλητή:

index.php<?php
  $test = $user;
?>

Αλλάξτε την ιδιότητα name στη μεταβλητή $test

index.php<?php
  $test->name = 'eric';
?>

Ας ελέγξουμε ότι άλλαξε το κοινό αντικείμενο. Εμφανίστε την ιδιότητα name από τη μεταβλητή $user:

index.php<?php
  echo $user->name; // θα εμφανίσει 'eric'!
?>
Задание 1

Δημιουργήστε την κλάση Product, στην οποία θα υπάρχουν οι ακόλουθες ιδιότητες: name, price.

Задание 2

Δημιουργήστε ένα αντικείμενο της κλάσης Product, καταγράψτε το στη μεταβλητή $product1.

Задание 3

Αντιγράψτε την τιμή της μεταβλητής $product1 στη μεταβλητή $product2. Ελέγξτε ότι και οι δύο μεταβλητές αναφέρονται στο ίδιο αντικείμενο.