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 пайдалану үшін қайта жасаңыз.