PHP da OOP da Faqat O'qish uchun Mo'ljallangan Xususiyatlar

Keling, barcha xususiyatlari private bo'lgan klassni ko'rib chiqaylik:

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

Endi bu xususiyatlarni tashqi dunyoda faqat o'qish uchun ruxsat etilgan qilaylik. Buni ilgari ham qilganmiz, har bir xususiyat uchun getterlar yaratgan va setterlar yaratmagan holda.

Keling, endi bu vazifani hal qilish uchun sehrli __get metodidan foydalanaylik. Unda so'ralgan xususiyatning qiymatini qaytaramiz. Buni qanday qilish kerak: so'ralgan xususiyatning nomi __get metodining parametriga kiradi, bizning holatda $property.

Bu shuni anglatadiki, biz o'zgaruvchida saqlanadigan xususiyat nomini o'qishimiz mumkin, mana shunday: $this->$property (xususiyat nomi o'zgaruvchi bo'ladi, ya'ni boshida dollar belgisi bilan, biz buni oldingi darslarda o'tganmiz).

Keling, tavsiflangan __get metodini yarataylik:

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

Keling, xususiyatlarni o'qish uchun undan foydalanaylik:

index.php<?php
  $test = new Test;
  
  echo $test->prop1; // 1 ni chiqaradi
  echo $test->prop2; // 2 ni chiqaradi
?>

Xususiyatga biror narsa yozishga urinish xatolikka olib keladi:

php<?php
  $test = new Test;
  $test->prop1 = 2; // xatolik beradi
?>

Bu aynan bizga kerak bo'lgan narsa: xususiyatni o'qish mumkin, lekin unga yozib bo'lmaydi.

Mavjud bo'lmagan xususiyatni o'qishga urinish xatolik beradi:

php<?php
  $test = new Test;
  echo $test->prop3; // xatolik beradi
?>

Shuningdek, quyidagi nuansga e'tibor bering: biz xususiyatlarni faqat o'qish uchun qilganimizda, eskicha usulda, xususiyatni o'qish uchun biz getter-metodidan foydalanganmiz.

Yangi usulda biz xususiyatlarga to'g'ridan-to'g'ri, xuddi ular public bo'lgandek murojaat qilamiz. Lekin ularga xuddi private bo'lgandek yozolmaymiz.

Задание 1

Quyidagi User klassi berilgan bo'lib, uning xususiyatlari faqat o'qish uchun getterlar yordamida ruxsat etilgan:

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;
    }
  }
?>

Ushbu klass kodini getterlar o'rniga sehrli __get metodi ishlatiladigan qilib o'zgartiring.