PHP da OOP da Faqat O'qish uchun Mo'ljallangan Xususiyatlar
Keling, barcha xususiyatlari private bo'lgan klassni ko'rib chiqaylik:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Endi bu xususiyatlarni tashqi dunyoda faqat o'qish uchun ruxsat etilgan qilaylik. Buni ilgari ham qilganmiz, har bir xususiyat uchun getterlar yaratgan va setterlar yaratmagan holda.
Keling, endi bu vazifani hal qilish uchun sehrli
__get metodidan foydalanaylik. Unda so'ralgan
xususiyatning qiymatini qaytaramiz. Buni qanday qilish
kerak: so'ralgan xususiyatning nomi __get
metodining parametriga kiradi, bizning holatda
$property.
Bu shuni anglatadiki, biz o'zgaruvchida saqlanadigan
xususiyat nomini o'qishimiz mumkin, mana shunday:
$this->$property (xususiyat nomi o'zgaruvchi
bo'ladi, ya'ni boshida dollar belgisi bilan, biz buni
oldingi darslarda o'tganmiz).
Keling, tavsiflangan __get metodini yarataylik:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Keling, xususiyatlarni o'qish uchun undan foydalanaylik:
<?php
$test = new Test;
echo $test->prop1; // 1 ni chiqaradi
echo $test->prop2; // 2 ni chiqaradi
?>
Xususiyatga biror narsa yozishga urinish xatolikka olib keladi:
<?php
$test = new Test;
$test->prop1 = 2; // xatolik beradi
?>
Bu aynan bizga kerak bo'lgan narsa: xususiyatni o'qish mumkin, lekin unga yozib bo'lmaydi.
Mavjud bo'lmagan xususiyatni o'qishga urinish xatolik beradi:
<?php
$test = new Test;
echo $test->prop3; // xatolik beradi
?>
Shuningdek, quyidagi nuansga e'tibor bering: biz xususiyatlarni faqat o'qish uchun qilganimizda, eskicha usulda, xususiyatni o'qish uchun biz getter-metodidan foydalanganmiz.
Yangi usulda biz xususiyatlarga to'g'ridan-to'g'ri, xuddi ular public bo'lgandek murojaat qilamiz. Lekin ularga xuddi private bo'lgandek yozolmaymiz.
Quyidagi User klassi berilgan bo'lib, uning
xususiyatlari faqat o'qish uchun getterlar
yordamida ruxsat etilgan:
<?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;
}
}
?>
Ushbu klass kodini getterlar o'rniga sehrli
__get metodi ishlatiladigan qilib o'zgartiring.