Passing Objects by Reference in OOP in PHP

Suppose we have the following class User:

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

Suppose we create an object of this class:

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

Now imagine the following situation: you want to assign the value of the variable $user to some other variable, for example $test.

If we were talking not about objects, but about primitives, such as strings, numbers, arrays, etc., then the variable $test would receive a copy of the value of the variable $user.

This means that changes to either variable in the future would not change the value of the other variable. Let's look at an example:

index.php<?php
  $user = 1;
  
  $test = $user; // the variable $test now has 1
  $test = 2;     // the variable $test now has 2, and $user still has 1
?>

With objects, it's different - when assigned to another variable, objects are not copied, but are passed by reference: this means that both of these variables have as their value the same object. This has an important consequence: if you change any properties of the object using one variable, the same changes will appear in the second variable.

Let's see it in practice. Let's create a user object:

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

Let's assign the object to another variable:

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

Let's change the name property in the variable $test

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

Let's check that the shared object has changed. Let's output the name property from the variable $user:

index.php<?php
  echo $user->name; // will output 'eric'!
?>
Задание 1

Create a class Product, in which there will be the following properties: name, price.

Задание 2

Create an object of the class Product, write it to the variable $product1.

Задание 3

Assign the value of the variable $product1 to the variable $product2. Check that both variables reference the same object.