Vain luku -ominaisuudet OOP:ssa PHP:ssä
Tarkastellaan luokkaa, jossa kaikki ominaisuudet ovat yksityisiä:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Tehdään nyt niin, että nämä ominaisuudet ulkoisessa maailmassa ovat saatavilla vain luku -oikeudella. Olemme aiemmin tehneet saman luomalla getterit jokaiselle ominaisuudelle ja jättämällä luomatta setterit.
Ratkaistaan nyt tämä tehtävä käyttämällä
maagista metodia __get. Palautamme
siinä pyydetyn ominaisuuden arvon. Kuinka
se tehdään: pyydetyn ominaisuuden nimi päätyy
metodin parametriin __get, meidän tapauksessamme
$property.
Tämä tarkoittaa, että voimme lukea ominaisuuden,
jonka nimi tallennetaan muuttujaan, näin:
$this->$property (ominaisuuden nimi on
muuttuja, eli dollarimerkki alussa, olemme
käyneet tämän läpi aikaisemmissa oppitunneissa).
Tehdään kuvattu metodi __get:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Käytetään sitä ominaisuuksien lukemiseen:
<?php
$test = new Test;
echo $test->prop1; // tulostaa 1
echo $test->prop2; // tulostaa 2
?>
Yritys kirjoittaa jotain ominaisuuteen johtaa virheeseen:
<?php
$test = new Test;
$test->prop1 = 2; // antaa virheen
?>
Tämä on juuri se, mitä tarvitsemme: ominaisuuden voi lukea, mutta siihen ei voi kirjoittaa.
Yritys lukea olematonta ominaisuutta antaa virheen:
<?php
$test = new Test;
echo $test->prop3; // antaa virheen
?>
Huomaa myös seuraa vivahde: kun teimme ominaisuuksista vain luku -oikeudella vanhalla tavalla, niin ominaisuuden lukemiseksi käytimme getter-metodia.
Uudessa tavassa käytämme ominaisuuksiin pääsyyn suoraan, ikään kuin ne olisivat julkisia. Mutta kirjoittaa niihin emme pysty, ikään kuin ne olisivat yksityisiä.
Olkoon annettu tällainen luokka User, jonka ominaisuudet
ovat saatavilla vain luku -oikeudella käyttämällä
gettereitä:
<?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;
}
}
?>
Muokkaa tämän luokan koodia niin, että getterien sijasta
käytetään maagista
metodia __get.