Tik skaitomos savybės OOP PHP
Panagrinėkime klasę, kurioje visos savybės yra privatūs:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Dabar padarykime taip, kad šios savybės išoriniame pasaulyje būtų prieinamos tik skaitymui. Anksčiau mes tai jau darėme, kurdami getter'ius kiekvienai savybei ir nekurdami setter'ių.
Dabar šiai problemai išspręsti pasinaudokime
magiškuoju metodu __get. Grąžinsime
jame užklaustos savybės reikšmę. Kaip
tai padaryti: užklaustos savybės pavadinimas patekia
į metodo __get parametrą, mūsų atveju
$property.
Tai reiškia, kad galime perskaityti savybę,
kurios pavadinimas saugomas kintamajame, štai taip:
$this->$property (savybės pavadinimas bus
kintamasis, tai yra su dolerio ženklu pradžioje, mes
tai mokėmės ankstesnėse pamokose).
Sukurkime aprašytą metodą __get:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Panaudokime jį savybių skaitymui:
<?php
$test = new Test;
echo $test->prop1; // išves 1
echo $test->prop2; // išves 2
?>
Bandymas ką nors įrašyti į savybę sukels klaidą:
<?php
$test = new Test;
$test->prop1 = 2; // išmes klaidą
?>
Tai būtent tai, ko mums reikia: savybę galima perskaityti, bet negalima įrašyti.
Bandymas perskaityti neegzistuojančią savybę išmes klaidą:
<?php
$test = new Test;
echo $test->prop3; // išmes klaidą
?>
Taip pat atkreipkite dėmesį į šį niuansą: kai mes darydavome savybes tik skaitymui senuoju būdu, norėdami perskaityti savybę, naudodavome metodo-getter'į.
Naujajame būde mes kreipsimės būtent į savybes, tarsi jos būtų viešos. Bet įrašyti į jas negalėsime, tarsi jos būtų privatūs.
Tegu duota štai tokia klasė User, kurios savybės
yra prieinamos tik skaitymui naudojant
getter'ius:
<?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;
}
}
?>
Pertvarkykite šios klasės kodą taip, kad vietoj
getter'ių būtų naudojamas magiškas
metodas __get.