Csak olvasható tulajdonságok az OOP-ban PHP-ben

Vizsgáljunk meg egy osztályt, ahol minden tulajdonság privát:

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

Most tegyük úgy, hogy ezek a tulajdonságok a külső világban csak olvashatók legyenek. Korábban már csináltunk ilyet, gettereket készítve minden tulajdonsághoz és nem készítve settereket.

Most oldjuk meg ezt a feladatot a varázsmetódus __get segítségével. Ebben fogjuk visszaadni a kért tulajdonság értékét. Hogyan tegyük: a kért tulajdonság neve a metódus __get paraméterébe kerül, esetünkben a $property-be.

Ez azt jelenti, hogy elolvashatjuk a tulajdonságot, amelynek neve egy változóban tárolódik, így: $this->$property (a tulajdonság neve változó lesz, vagyis dollárjellel az elején, ezt átvettük a korábbi leckékben).

Készítsük el az említett __get metódust:

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

Használjuk fel tulajdonságok olvasására:

index.php<?php
  $test = new Test;
  
  echo $test->prop1; // kiírja 1-et
  echo $test->prop2; // kiírja 2-t
?>

Ha megpróbálunk valamit beírni a tulajdonságba, az hibához vezet:

php<?php
  $test = new Test;
  $test->prop1 = 2; // hibát jelez
?>

Pontosan erre van szükségünk: a tulajdonság olvasható, de nem írható.

Ha nem létező tulajdonságot próbálunk elolvasni, az hibát jelez:

php<?php
  $test = new Test;
  echo $test->prop3; // hibát jelez
?>

Figyeljünk a következő árnyalatra is: amikor a régi módszerrel készítettük a csak olvasható tulajdonságokat, akkor a tulajdonság olvasásához getter metódust használtunk.

Az új módszerben mi maguk a tulajdonságokhoz fognak hozzáférni, mintha publikusak lennének. De beleírni nem tudunk, mintha privátok lennének.

Задание 1

Legyen adott a következő User osztály, amelynek tulajdonságai csak olvashatók getterek segítségével:

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

Alakítsa át az osztály kódját úgy, hogy a getterek helyett a varázsmetódus __get kerüljön felhasználásra.