คุณสมบัติแบบอ่านอย่างเดียวใน OOP ใน PHP

ลองพิจารณาคลาสที่มีคุณสมบัติทั้งหมดเป็นส่วนตัว:

Test.php<?php
  class Test
  {
    private $prop1 = 1;
    private $prop2 = 2;
  }
?>

ตอนนี้ทำให้คุณสมบัติเหล่านี้ในโลกภายนอกสามารถเข้าถึงได้เฉพาะสำหรับการอ่านเท่านั้น ก่อนหน้านี้เราเคยทำแบบนี้โดยสร้าง getter สำหรับแต่ละคุณสมบัติและไม่สร้าง setter

ตอนนี้เพื่อแก้ไขปัญหานี้ เราจะใช้เมธอดเวทมนตร์ __get เราจะคืนค่าในนั้นของคุณสมบัติที่ร้องขอ วิธีการทำ: ชื่อของคุณสมบัติที่ร้องขอจะเข้าสู่พารามิเตอร์ของเมธอด __get ในกรณีของเราคือ $property

นั่นหมายความว่าเราสามารถอ่านคุณสมบัติที่มีชื่อเก็บอยู่ในตัวแปรได้ดังนี้: $this->$property (ชื่อคุณสมบัติจะเป็นตัวแปร นั่นคือมีเครื่องหมายดอลลาร์อยู่ข้างหน้า เราเคยเรียนเรื่องนี้ในบทเรียนก่อนหน้านี้)

ลองสร้างเมธอด __get ที่อธิบายไว้:

Test.php<?php
  class Test
  {
    private $prop1 = 1;
    private $prop2 = 2;
    
    public function __get($property)
    {
      return $this->$property;
    }
  }
?>

มาใช้มันเพื่ออ่านคุณสมบัติ:

index.php<?php
  $test = new Test;
  
  echo $test->prop1; // จะแสดง 1
  echo $test->prop2; // จะแสดง 2
?>

ความพยายามในการเขียนบางสิ่งลงในคุณสมบัติจะทำให้เกิดข้อผิดพลาด:

php<?php
  $test = new Test;
  $test->prop1 = 2; // จะทำให้เกิดข้อผิดพลาด
?>

นี่คือสิ่งที่เราต้องการ: คุณสมบัติสามารถอ่านได้ แต่ไม่สามารถเขียนได้

ความพยายามในการอ่านคุณสมบัติที่ไม่มีอยู่จะทำให้เกิดข้อผิดพลาด:

php<?php
  $test = new Test;
  echo $test->prop3; // จะทำให้เกิดข้อผิดพลาด
?>

โปรดสังเกตความแตกต่างต่อไปนี้ด้วย: เมื่อเราสร้างคุณสมบัติสำหรับอ่านอย่างเดียวด้วยวิธีเก่า เพื่อที่จะอ่านคุณสมบัติ เราใช้เมธอด getter

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

Задание 1

ให้คลาส User นี้ ที่คุณสมบัติของมันสามารถเข้าถึงได้สำหรับการอ่านเท่านั้นโดยใช้ getters:

php<?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