Vlastnosti len na čítanie v OOP v PHP

Pozrime sa na triedu, v ktorej sú všetky vlastnosti súkromné:

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

Teraz urobme tak, aby tieto vlastnosti boli v externe dostupné len na čítanie. Podobné sme už robili, keď sme vytvárali gettre pre každú vlastnosť a nevytvárali settre.

Poďme teraz na vyriešenie tejto úlohy použiť magickú metódu __get. Budeme v nej vracať hodnotu požadovanej vlastnosti. Ako to urobiť: názov požadovanej vlastnosti sa dostane do parametra metódy __get, v našom prípade $property.

To znamená, že môžeme prečítať vlastnosť, ktorej názov je uložený v premennej, takto: $this->$property (názov vlastnosti bude premenná, teda s dolárom na začiatku, to sme preberali v predchádzajúcich lekciách).

Urobme opísanú metódu __get:

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

Využime ju na čítanie vlastností:

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

Pokus o zápis čohokoľvek do vlastnosti povedie k chybe:

php<?php
  $test = new Test;
  $test->prop1 = 2; // vyvolá chybu
?>

Je to presne to, čo potrebujeme: vlastnosť možno prečítať, ale nie zapisovať.

Pokus o prečítanie neexistujúcej vlastnosti vyvolá chybu:

php<?php
  $test = new Test;
  echo $test->prop3; // vyvolá chybu
?>

Všimnite si tiež nasledujúcu nuansu: keď sme robili vlastnosti len na čítanie starým spôsobom, tak na to, aby sme prečítali vlastnosť, sme používali metódu-getter.

V novom spôsob budeme pristupovať priamo k vlastnostiam, akoby boli verejné. Ale zapísať do nich nebudeme môcť, akoby boli súkromné.

Задание 1

Nech je daná takáto trieda User, ktorej vlastnosti sú dostupné len na čítanie pomocou getterov:

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

Upravte kód tejto triedy tak, aby namiesto getterov bol použitý magický metód __get.