Својства само за читање у ООП у 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.