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