მხოლოდ წაკითხვის თვისებები OOP-ში PHP-ში
განვიხილოთ კლასი, რომელშიც ყველა თვისება პრივატულია:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
ახლა მოდით გავხადოთ ეს თვისებები გარე სამყაროში მხოლოდ წაკითხვისთვის ხელმისაწვდომი. ამის გაკეთება ადრეც გვაკეთებია, ყოველი თვისებისთვის შევქმენით გეთერები და არ შევქმენით სეთერები.
მოდით ახლა ამ ამოცანის გადასაჭრელად გამოვიყენოთ
მაგიური მეთოდი __get. მასში დავაბრუნებთ
მოთხოვნილი თვისების მნიშვნელობას. როგორ
გავაკეთოთ ეს: მოთხოვნილი თვისების სახელი მოდის
მეთოდის პარამეტრში __get, ჩვენს შემთხვევაში
$property.
ეს ნიშნავს, რომ ჩვენ შეგვიძლია წავიკითხოთ თვისება,
რომლის სახელიც ინახება ცვლადში, ასე:
$this->$property (თვისების სახელი იქნება
ცვლადი, ანუ დოლარის ნიშნით თავში, ეს
ჩვენ გავიარეთ წინა გაკვეთილებში).
მოდით გავაკეთოთ აღწერილი მეთოდი __get:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
გამოვიყენოთ იგი თვისებების წასაკითხად:
<?php
$test = new Test;
echo $test->prop1; // გამოიტანს 1-ს
echo $test->prop2; // გამოიტანს 2-ს
?>
თვისებაში რაიმეს ჩაწერის მცდელობა გამოიწვევს შეცდომას:
<?php
$test = new Test;
$test->prop1 = 2; // გამოიღებს შეცდომას
?>
ეს არის ზუსტად ის, რაც გვჭირდება: თვისების წაკითხვა შესაძლებელია, მაგრამ ჩაწერა არა.
არარსებული თვისების წაკითხვის მცდელობა გამოიწვევს შეცდომას:
<?php
$test = new Test;
echo $test->prop3; // გამოიღებს შეცდომას
?>
აგრეთვე მიაქციეთ ყურადღებას შემდეგ ნიუანს: როდესაც ჩვენ ვაკეთებდით თვისებებს მხოლოდ წაკითხვისთვის ძველი გზით, მაშინ თვისების წასაკითხად ჩვენ ვიყენებდით მეთოდ-გეთერს.
ახალ გზაში ჩვენ ვმიმართავთ ზუსტად თვისებებს, თითქოს ისინი პუბლიკური არიან. მაგრამ მათში ჩაწერა ვერ შევძლებთ, თითქოს ისინი პრივატული არიან.
მოცემულია ასეთი კლასი User, რომლის თვისებები
მხოლოდ წაკითხვისთვის ხელმისაწვდომია
გეთერების მეშვეობით:
<?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.