⊗ppOpMgROP 89 of 107 menu

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

azbydeenesfrkakkptruuz