Tik skaitomos savybės OOP PHP

Panagrinėkime klasę, kurioje visos savybės yra privatūs:

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

Dabar padarykime taip, kad šios savybės išoriniame pasaulyje būtų prieinamos tik skaitymui. Anksčiau mes tai jau darėme, kurdami getter'ius kiekvienai savybei ir nekurdami setter'ių.

Dabar šiai problemai išspręsti pasinaudokime magiškuoju metodu __get. Grąžinsime jame užklaustos savybės reikšmę. Kaip tai padaryti: užklaustos savybės pavadinimas patekia į metodo __get parametrą, mūsų atveju $property.

Tai reiškia, kad galime perskaityti savybę, kurios pavadinimas saugomas kintamajame, štai taip: $this->$property (savybės pavadinimas bus kintamasis, tai yra su dolerio ženklu pradžioje, mes tai mokėmės ankstesnėse pamokose).

Sukurkime aprašytą metodą __get:

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

Panaudokime jį savybių skaitymui:

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

Bandymas ką nors įrašyti į savybę sukels klaidą:

php<?php
  $test = new Test;
  $test->prop1 = 2; // išmes klaidą
?>

Tai būtent tai, ko mums reikia: savybę galima perskaityti, bet negalima įrašyti.

Bandymas perskaityti neegzistuojančią savybę išmes klaidą:

php<?php
  $test = new Test;
  echo $test->prop3; // išmes klaidą
?>

Taip pat atkreipkite dėmesį į šį niuansą: kai mes darydavome savybes tik skaitymui senuoju būdu, norėdami perskaityti savybę, naudodavome metodo-getter'į.

Naujajame būde mes kreipsimės būtent į savybes, tarsi jos būtų viešos. Bet įrašyti į jas negalėsime, tarsi jos būtų privatūs.

Задание 1

Tegu duota štai tokia klasė User, kurios savybės yra prieinamos tik skaitymui naudojant getter'ius:

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

Pertvarkykite šios klasės kodą taip, kad vietoj getter'ių būtų naudojamas magiškas metodas __get.