Överföring av objekt genom referens i OOP i PHP

Låt oss säga att vi har följande klass User:

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

Låt oss säga att vi skapar ett objekt av denna klass:

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

Föreställ dig nu följande situation: du vill tilldela värdet av variabeln $user till en annan variabel, till exempel $test.

Om det inte handlade om objekt, utan om primitiva typer, dvs strängar, nummer, arrayer etc., skulle en kopia av värdet av variabeln $user hamna i variabeln $test.

Det betyder att ändringar i någon av variablerna herefter inte skulle ändra värdet på den andra variabeln. Låt oss titta på ett exempel:

index.php<?php
  $user = 1;
  
  $test = $user; // i variabeln $test finns nu 1
  $test = 2;     // i variabeln $test finns nu 2, men i $user finns fortfarande 1
?>

Med objekt är det annorlunda - när de tilldelas till en annan variabel kopieras inte objekten, utan överförs genom referens: det betyder att båda dessa variabler har samma objekt som värde. Detta har en viktig konsekvens: om några egenskaper i objektet ändras med hjälp av en variabel, kommer samma ändringar att dyka upp i den andra variabeln.

Låt oss se det i praktiken. Skapa ett användarobjekt:

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

Tilldela objektet till en annan variabel:

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

Låt oss ändra egenskapen name i variabeln $test

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

Låt oss kontrollera att det delade objektet har ändrats. Låt oss skriva ut egenskapen name från variabeln $user:

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

Skapa en klass Product, där följande egenskaper finns: name, price.

Задание 2

Skapa ett objekt av klassen Product, skriv det till variabeln $product1.

Задание 3

Tilldela värdet av variabeln $product1 till variabeln $product2. Kontrollera att båda variablerna refererar till ett och samma objekt.