PHP-də OOP-də Yalnız Oxu üçün Xassələr
Gəlin, bütün xassələri private olan bir sinifə baxaq:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
İndi bu xassələrin xarici dünyada yalnız oxu üçün əlçatan olmasını təmin edək. Bunu əvvəllər də etmişik, hər bir xassə üçün getterlər yaradır və setterlər yaratmırdıq.
Gəlin indi bu problemi həll etmək üçün sehrli
__get metodundan istifadə edək. İstənilən
xassənin qiymətini onda qaytaraq. Bunu necə
etmək olar: istənilən xassənin adı __get
metodunun parametrinə düşür, bizim halda
$property.
Bu o deməkdir ki, biz adı dəyişəndə saxlanılan
xassəni belə oxuya bilərik: $this->$property
(xassənin adı dəyişən olacaq, yəni əvvəlcə dollar
işarəsi ilə, biz bunu əvvəlki dərslərdə keçmişdik).
Gəlin təsvir edilən __get metodunu edək:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Xassələri oxumaq üçün ondan istifadə edək:
<?php
$test = new Test;
echo $test->prop1; // 1 çap edəcək
echo $test->prop2; // 2 çap edəcək
?>
Xassəyə bir şey yazmaq cəhdi səhvə səbəb olacaq:
<?php
$test = new Test;
$test->prop1 = 2; // səhv verəcək
?>
Bu bizim üçün lazım olan şeydir: xassəni oxumaq olar, amma yazmaq olmaz.
Mövcud olmayan xassəni oxumaq cəhdi səhv verəcək:
<?php
$test = new Test;
echo $test->prop3; // səhv verəcək
?>
Aşağıdakı nüansə da diqqət yetirin: biz xassələri yalnız oxu üçün köhnə üsulla etdiyimiz zaman, xassəni oxumaq üçün getter-metodundan istifadə edirdik.
Yeni üsulda biz sanki onlar public imiş kimi dəqiq xassələrə müraciət edəcəyik. Amma onlara sanki private imiş kimi yaza bilməyəcəyik.
Tutaq ki, User adlı bir sinif verilib, onun
xassələri getterlər vasitəsilə yalnız oxu üçün
əlçatandır:
<?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;
}
}
?>
Bu sinfin kodunu elə dəyişin ki, getterlər əvəzinə
sehrli __get metodu istifadə olunsun.