คุณสมบัติแบบอ่านอย่างเดียวใน OOP ใน PHP
ลองพิจารณาคลาสที่มีคุณสมบัติทั้งหมดเป็นส่วนตัว:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
ตอนนี้ทำให้คุณสมบัติเหล่านี้ในโลกภายนอกสามารถเข้าถึงได้เฉพาะสำหรับการอ่านเท่านั้น ก่อนหน้านี้เราเคยทำแบบนี้โดยสร้าง getter สำหรับแต่ละคุณสมบัติและไม่สร้าง setter
ตอนนี้เพื่อแก้ไขปัญหานี้ เราจะใช้เมธอดเวทมนตร์ __get เราจะคืนค่าในนั้นของคุณสมบัติที่ร้องขอ วิธีการทำ: ชื่อของคุณสมบัติที่ร้องขอจะเข้าสู่พารามิเตอร์ของเมธอด __get ในกรณีของเราคือ $property
นั่นหมายความว่าเราสามารถอ่านคุณสมบัติที่มีชื่อเก็บอยู่ในตัวแปรได้ดังนี้: $this->$property (ชื่อคุณสมบัติจะเป็นตัวแปร นั่นคือมีเครื่องหมายดอลลาร์อยู่ข้างหน้า เราเคยเรียนเรื่องนี้ในบทเรียนก่อนหน้านี้)
ลองสร้างเมธอด __get ที่อธิบายไว้:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
มาใช้มันเพื่ออ่านคุณสมบัติ:
<?php
$test = new Test;
echo $test->prop1; // จะแสดง 1
echo $test->prop2; // จะแสดง 2
?>
ความพยายามในการเขียนบางสิ่งลงในคุณสมบัติจะทำให้เกิดข้อผิดพลาด:
<?php
$test = new Test;
$test->prop1 = 2; // จะทำให้เกิดข้อผิดพลาด
?>
นี่คือสิ่งที่เราต้องการ: คุณสมบัติสามารถอ่านได้ แต่ไม่สามารถเขียนได้
ความพยายามในการอ่านคุณสมบัติที่ไม่มีอยู่จะทำให้เกิดข้อผิดพลาด:
<?php
$test = new Test;
echo $test->prop3; // จะทำให้เกิดข้อผิดพลาด
?>
โปรดสังเกตความแตกต่างต่อไปนี้ด้วย: เมื่อเราสร้างคุณสมบัติสำหรับอ่านอย่างเดียวด้วยวิธีเก่า เพื่อที่จะอ่านคุณสมบัติ เราใช้เมธอด getter
ในวิธีใหม่ เราจะเข้าถึงคุณสมบัติเหล่านั้นโดยตรง ราวกับว่าพวกมันเป็นสาธารณะ แต่เราจะไม่สามารถเขียนลงในพวกมันได้ ราวกับว่าพวกมันเป็นส่วนตัว
ให้คลาส User นี้ ที่คุณสมบัติของมันสามารถเข้าถึงได้สำหรับการอ่านเท่านั้นโดยใช้ getters:
<?php
class User
{
private $name;
private $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
ปรับปรุงโค้ดของคลาสนี้ใหม่เพื่อให้ใช้เมธอดเวทมนตร์ __get แทน getters