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:

Test.php<?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:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
    
    public function __set($property, $value)
    {
      var_dump($property . ' ' .$value);
    }
  }
?>

Testataan luokkamme toimintaa:

index.php<?php
  $test = new Test;
  $test->prop = 'value'; // __set-metodin var_dump tulostaa 'prop value'
?>

Aloitetaan nyt arvon asettaminen ominaisuudelle, jonka nimi tallennetaan muuttujaan $property:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
    
    public function __set($property, $value)
    {
      $this->$property = $value; // asetetaan arvo
    }
  }
?>

Nyt voimme kirjoittaa yksityisiin ominaisuuksiin luokan ulkopuolelta:

index.php<?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:

Test.php<?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:

index.php<?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.