Ominaisuuksien kirjoittaminen taikuudella OOP:ssa PHP:ssä
Taikamenetelmä __set kutsutaan
kun yritetään muuttaa olematoman
tai piilotetun ominaisuuden arvoa. Parametreina
se saa vastaanottaa ominaisuuden nimen ja arvon, joka
sille yritetään antaa.
Katsotaan käytännön esimerkkiä.
Olkoon meillä annettu tällainen luokka Test:
<?php
class Test
{
private $prop1;
private $prop2;
}
?>
Tehdään tähän luokkaan taikamenetelmä
__set, joka funktion
var_dump avulla tulostaa ominaisuuden nimen,
johon käännyttiin, ja arvon,
joka sille yritetään asettaa:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
var_dump($property . ' ' .$value);
}
}
?>
Testataan luokkamme toimintaa:
<?php
$test = new Test;
$test->prop = 'value'; // __set-metodin var_dump tulostaa 'prop value'
?>
Aloitetaan nyt arvon asettaminen
ominaisuudelle, jonka nimi tallennetaan muuttujaan
$property:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value; // asetetaan arvo
}
}
?>
Nyt voimme kirjoittaa yksityisiin ominaisuuksiin luokan ulkopuolelta:
<?php
$test = new Test;
$test->prop1 = 1; // kirjoitetaan 1
$test->prop2 = 2; // kirjoitetaan 2
?>
Kirjoittaa voimme, mutta tarkistaa, kirjoittuiko sinne jotain - ei, koska ominaisuudet ovat yksityisiä.
Voimme tehdä getterin näille ominaisuuksille tai
käyttää taikamenetelmää
__get. Käytetään toista vaihtoehtoa:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value;
}
// Ominaisuuksien taika getter:
public function __get($property)
{
return $this->$property;
}
}
?>
Vasta nyt voimme tarkistaa luokkamme toiminnan. Tarkistetaan:
<?php
$test = new Test;
$test->prop1 = 1; // kirjoitetaan 1
$test->prop2 = 2; // kirjoitetaan 2
echo $test->prop1; // tulostaa 1
echo $test->prop2; // tulostaa 2
?>
Todellisuudessa ei tietenkään pidä sallia kaikkien kirjoittaa yksityisiin ominaisuuksiin, muuten menetetään näiden yksityisten ominaisuuksien merkitys (on helpompi tehdä ne julkisiksi ja siinä kaikki).
Siksi tätä menetelmää tulisi käyttää vain silloin, kun siitä todella on tarvetta. Seuraavissa oppitunneissa tarkastelemme vielä esimerkkejä onnistuneesta soveltamisesta.