Уласцівасці толькі для чытання ў ААП у PHP

Давайце разгледзім клас, у якім усе ўласцівасці прыватныя:

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

Цяпер зробім так, каб гэтыя ўласцівасці ў знешнім свеце былі даступныя толькі для чытання. Раней мы такое ўжо рабілі, ствараючы гетэры для кожнай уласцівасці і не ствараючы сетэры.

Давайце цяпер для вырашэння гэтай задачы скарыстаемся магічным метадам __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; // выдасць памылку
?>

Звярніце таксама ўвагу на наступны нюанс: калі мы рабілі ўласцівасці толькі для чытання старым спосабам, то для таго, каб прачытаць ўласцівасць, мы выкарыстоўвалі метад-гетэр.

У новым спосабе мы будзем звяртацца менавіта да ўласцівасцей, быццам яны публічныя. Але запісаць у іх не зможам, быццам яны прыватныя.

Задание 1

Хай дадзены вось такі клас User, уласцівасці якога даступныя толькі для чытання з дапамогай гетэраў:

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.