การส่งออบเจ็กต์โดยการอ้างอิงใน OOP ใน 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 ตรวจสอบ ว่าทั้งสองตัวแปรอ้างอิงไปยังออบเจ็กต์อันเดียวกัน