Omaduste määramine magia abil OOP-s PHP-s
Magic meetod __set kutsutakse välja
kui proovida muuta olematu
või peidetud omaduse väärtust. Parameetritena
võtab ta vastu omaduse nime ja väärtuse, mida
talle üritatakse omistada.
Vaatame praktilisel näitel.
Olgu meil antud selline klass Test:
<?php
class Test
{
private $prop1;
private $prop2;
}
?>
Teeme selles klassis magic
meetodi __set, mis funktsiooni
var_dump abil kuvab omaduse nime,
millele juurdepääs toimus, ja väärtuse,
millele seda omadust üritatakse määrata:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
var_dump($property . ' ' .$value);
}
}
?>
Kontrollime meie klassi tööd:
<?php
$test = new Test;
$test->prop = 'value'; // __set meetodi var_dump kuvab 'prop value'
?>
Hakkame nüüd määrama väärtust
omadusele, mille nimi on salvestatud muutujas
$property:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value; // määrame väärtuse
}
}
?>
Nüüd saame kirjutada privaatsetesse omadustesse klassist väljaspool:
<?php
$test = new Test;
$test->prop1 = 1; // kirjutame 1
$test->prop2 = 2; // kirjutame 2
?>
Kirjutada saame küll, aga kontrollida, kas sinna midagi kirjutati - ei saa, kuna omadused on privaatsed.
Saame teha getteri nende omaduste jaoks või
lihtsalt kasutada magic meetodit
__get. Kasutame teist võimalust:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
$this->$property = $value;
}
// Magic getter omaduste jaoks:
public function __get($property)
{
return $this->$property;
}
}
?>
Nüüd saame kontrollida meie klassi tööd. Kontrollime:
<?php
$test = new Test;
$test->prop1 = 1; // kirjutame 1
$test->prop2 = 2; // kirjutame 2
echo $test->prop1; // kuvab 1
echo $test->prop2; // kuvab 2
?>
Tegelikult ei peaks muidugi lubama kõigil kirjutada privaatsetesse omadustesse, muidu kaotab nende privaatsete omaduste mõte ära (lihtsam on teha need avalikuks ja kõik).
Seetõttu tuleks seda meetodit rakendada ainult siis, kui sellel on tõesti vajadus. Järgmistes õppetükides me vaatame veel näiteid õnnestunud rakendamisest.