მხოლოდ წაკითხვის თვისებები OOP-ში 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.