Read-only Properties in OOP in PHP

Hajde da razmotrimo klas u kome su sva svojstva privatna:

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

Sada učinimo da ova svojstva u spoljašnjem svetu budu dostupna samo za čitanje. Ranije smo već to radili, kreirajući getere za svako svojstvo i ne kreirajući setere.

Hajde sada da za rešavanje ovog zadatka iskoristimo magičnu metodu __get. Vraćaćemo u njoj vrednost traženog svojstva. Kako to uraditi: ime traženog svojstva dolazi u parametar metode __get, u našem slučaju $property.

To znači da možemo pročitati svojstvo, čije ime se čuva u promenljivoj, ovako: $this->$property (ime svojstva će biti promenljivo, odnosno sa dolarom na početku, mi smo to prošli u prethodnim lekcijama).

Hajde da napravimo opisanu metodu __get:

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

Iskoristimo je za čitanje svojstava:

index.php<?php
  $test = new Test;
  
  echo $test->prop1; // ispisaće 1
  echo $test->prop2; // ispisaće 2
?>

Pokušaj da se nešto upiše u svojstvo dovest će do greške:

php<?php
  $test = new Test;
  $test->prop1 = 2; // ispisaće grešku
?>

To je upravo ono što nam je potrebno: svojstvo se može čitati, ali se ne može upisivati.

Pokušaj čitanja nepostojećeg svojstva ispisaće grešku:

php<?php
  $test = new Test;
  echo $test->prop3; // ispisaće grešku
?>

Obratite takođe pažnju na sledeću nijansu: kada smo pravili svojstva samo za čitanje starim načinom, onda smo da bismo pročitali svojstvo, koristili metodu-geter.

U novom načinu mi ćemo se obraćati upravo svojstvima, kao da su javna. Ali upisati u njih nećemo moći, kao da su privatna.

Задание 1

Neka je dat evo takav klas User, čija svojstva su dostupna samo za čitanje uz pomoć getera:

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

Preoblikujte kod ovog klasa tako da umesto getera bude korišćena magična metoda __get.