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 колдонулушу үчүн өзгөртүңүз.