Kirjutamatuad omadused OOP-s PHP-s
Vaatleme klassi, kus kõik omadused on privaatsed:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Teeme nüüd nii, et need omadused oleksid välises maailmas saadaval ainult lugemiseks. Oleme seda varem teinud, luues iga omaduse jaoks getterid ja mitte luues settereid.
Kasutame nüüd selle ülesande lahendamiseks
magilist meetodit __get. Tagastame
selles päritud omaduse väärtuse. Kuidas
seda teha: päritud omaduse nimi satub
meetodi __get parameetrisse,
meie puhul $property.
See tähendab, et me saame lugeda omadust,
mille nimi on salvestatud muutujasse, nii:
$this->$property (omaduse nimi on
muutuv, see tähendab dollarmärgiga alguses, me
oleme seda õppinud eelmistes õppetundides).
Teeme kirjeldatud meetodi __get:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Kasutame seda omaduste lugemiseks:
<?php
$test = new Test;
echo $test->prop1; // väljastab 1
echo $test->prop2; // väljastab 2
?>
Katse midagi omadusse kirjutada viib veani:
<?php
$test = new Test;
$test->prop1 = 2; // annab vea
?>
See on täpselt see, mida me vajame: omadust saab lugeda, kuid sinna ei saa kirjutada.
Katse lugeda olematut omadust annab vea:
<?php
$test = new Test;
echo $test->prop3; // annab vea
?>
Pange tähele ka järgmist nüanssi: kui me tegime omadused kirjutamatuteks vanal viisil, siis omaduse lugemiseks kasutasime meetodit-getterit.
Uues viisis me pöördume otse omaduste poole, justkui need oleksid avalikud. Kuid sinna kirjutada ei saa, justkui need oleksid privaatsed.
Olgu antud järgmine klass User, mille omadused
on saadaval ainult lugemiseks kasutades
gettereid:
<?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;
}
}
?>
Teisendage selle klassi kood nii, et getterite asemel
kasutatakse magilist
meetodit __get.