Lastnosti samo za branje v OOP v PHP
Oglejmo si razred, v katerem so vse lastnosti zasebne:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Zdaj naredimo tako, da so te lastnosti v zunanjem svetu dostopne samo za branje. To smo že naredili prej, ko smo ustvarili getterje za vsako lastnost in nismo ustvarili setterjev.
Zdaj pa za rešitev te težave uporabimo
čarobno metodo __get. V njej bomo vrnili
vrednost zahtevane lastnosti. Kako
to narediti: ime zahtevane lastnosti pride
v parameter metode __get, v našem primeru
$property.
To pomeni, da lahko preberemo lastnost,
katere ime je shranjeno v spremenljivki, takole:
$this->$property (ime lastnosti bo
spremenljivka, torej z dolarjem na začetku, to
smo obravnavali v prejšnjih lekcijah).
Naredimo opisano metodo __get:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Uporabimo jo za branje lastnosti:
<?php
$test = new Test;
echo $test->prop1; // izpiše 1
echo $test->prop2; // izpiše 2
?>
Poskus zapisa nečesa v lastnost bo povzročil napako:
<?php
$test = new Test;
$test->prop1 = 2; // bo povzročilo napako
?>
To je točno tisto, kar potrebujemo: lastnost je mogoče brati, vanjo pa ni mogoče pisati.
Poskus branja neobstoječe lastnosti bo povzročil napako:
<?php
$test = new Test;
echo $test->prop3; // bo povzročilo napako
?>
Bodite pozorni tudi na naslednjo podrobnost: ko smo delali lastnosti samo za branje na stari način, smo za branje lastnosti uporabili metodo-getter.
V novem načinu bomo dostopali neposredno do lastnosti, kot da so javne. Vanje pa ne bomo mogli pisati, kot da so zasebne.
Dan naj bo naslednji razred User, katerega lastnosti
so dostopne samo za branje s pomočjo
getterjev:
<?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;
}
}
?>
Preoblikujte kodo tega razreda tako, da namesto
getterjev uporabite čarobno
metodo __get.