Właściwości tylko do odczytu w OOP w PHP

Rozważmy klasę, w której wszystkie właściwości są prywatne:

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

Teraz sprawmy, aby te właściwości na zewnątrz były dostępne tylko do odczytu. Robiliśmy to już wcześniej, tworząc gettery dla każdej właściwości i nie tworząc setterów.

Rozwiążmy teraz to zadanie wykorzystując metodę magiczną __get. Będziemy zwracać w niej wartość żądanej właściwości. Jak to zrobić: nazwa żądanej właściwości trafia do parametru metody __get, w naszym przypadku $property.

Oznacza to, że możemy odczytać właściwość, której nazwa jest przechowywana w zmiennej, w ten sposób: $this->$property (nazwa właściwości będzie zmienną, czyli z dolarem na początku, przerabialiśmy to na poprzednich lekcjach).

Stwórzmy opisaną metodę __get:

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

Wykorzystajmy ją do odczytu właściwości:

index.php<?php
  $test = new Test;
  
  echo $test->prop1; // wyświetli 1
  echo $test->prop2; // wyświetli 2
?>

Próba zapisania czegoś do właściwości spowoduje błąd:

php<?php
  $test = new Test;
  $test->prop1 = 2; // zwróci błąd
?>

To dokładnie to, czego potrzebujemy: właściwość można odczytywać, ale nie można do niej zapisywać.

Próba odczytu nieistniejącej właściwości zwróci błąd:

php<?php
  $test = new Test;
  echo $test->prop3; // zwróci błąd
?>

Zwróć również uwagę na następujący niuans: kiedy robiliśmy właściwości tylko do odczytu starym sposobem, to aby odczytać właściwość, używaliśmy metody-gettera.

W nowym sposobie będziemy się odwoływać właśnie do właściwości, jakby były publiczne. Ale zapisać do nich nie będziemy mogli, jakby były prywatne.

Задание 1

Niech będzie dana taka klasa User, której właściwości są dostępne tylko do odczytu za pomocą getterów:

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

Przerób kod tej klasy tak, aby zamiast getterów używana była metoda magiczna __get.