การเข้าถึงคุณสมบัติผ่านเวทมนตร์ใน OOP ใน PHP

เมธอดเวทมนตร์ถัดไปที่เราจะวิเคราะห์ร่วมกัน เรียกว่า __get เมธอดนี้จะทำงานเมื่อพยายามอ่านค่า ของคุณสมบัติแบบ private หรือ protected

หากนำเมธอด __get ไป implement ในคลาสใดๆ การอ้างอิงถึงคุณสมบัติที่ไม่มีอยู่ หรือคุณสมบัติที่ถูกซ่อนไว้ทั้งหมดจะถูกประมวลผล โดยเมธอดนี้

ในขณะที่ PHP จะส่งชื่อของคุณสมบัติที่ถูกขอ ไปยังพารามิเตอร์แรกของเมธอดนี้โดยอัตโนมัติ และค่าที่ส่งคืนโดยเมธอดนี้ จะถูกตีความว่าเป็นค่าของคุณสมบัติ ที่ถูกอ้างอิงถึง

คงยังไม่ค่อยเข้าใจนักว่ามันทำงานอย่างไร ดังนั้นมาดูตัวอย่างเชิงปฏิบัติกัน สมมติว่าเรามีคลาส Test แบบนี้ ที่มีคุณสมบัติแบบ private และ public:

Test.php<?php
  class Test
  {
    public  $prop1 = 1; // คุณสมบัติสาธารณะ
    private $prop2 = 2; // คุณสมบัติส่วนตัว
  }
?>

ลองเพิ่มเมธอดเวทมนตร์ __get ลงในคลาสของเรา ซึ่งเริ่มแรกจะเพียงแค่ ส่งคืนชื่อของคุณสมบัติที่ถูกอ้างอิงถึง:

Test.php<?php
  class Test
  {
    public  $prop1 = 1;
    private $prop2 = 2;
    
    public function __get($property)
    {
      return $property; // แค่ส่งคืนชื่อคุณสมบัติ
    }
  }
?>

มาทดสอบการทำงานของเมธอดเวทมนตร์ที่สร้างขึ้น ลองอ้างอิงถึงคุณสมบัติสามประเภท: ถึง คุณสมบัติสาธารณะ ถึงคุณสมบัติส่วนตัว และ ถึงคุณสมบัติที่ไม่มีอยู่:

index.php<?php
  $test = new Test;
  
  // อ้างอิงถึงคุณสมบัติสาธารณะ:
  echo $test->prop1; // จะแสดง 1 - ซึ่งคือค่าของคุณสมบัติ
  
  // อ้างอิงถึงคุณสมบัติส่วนตัว:
  echo $test->prop2; // จะแสดง 'prop2' - ชื่อคุณสมบัติ
  
  // อ้างอิงถึงคุณสมบัติที่ไม่มีอยู่:
  echo $test->prop3; // จะแสดง 'prop3' - ชื่อคุณสมบัติ
?>

อย่างที่คุณเห็น เมธอดเวทมนตร์ของเราตอบสนอง ต่อการอ้างอิงถึงคุณสมบัติส่วนตัวและคุณสมบัติที่ไม่มีอยู่ แต่ไม่สนใจการอ้างอิงถึงคุณสมบัติสาธารณะ - พวกมันทำงานเหมือนเดิม