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