Zápis vlastností pomocou kúzel v OOP v PHP

Kúzelná metóda __set sa volá pri pokuse o zmenu hodnoty neexistujúcej alebo skrytej vlastnosti. Ako parametre prijíma názov vlastnosti a hodnotu, ktorú sa jej pokúšajú priradiť.

Pozrime sa na praktický príklad. Majme danú takúto triedu Test:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
  }
?>

Vytvorme v tejto triede kúzelnú metódu __set, ktorá pomocou funkcie var_dump vypíše názov vlastnosti, ku ktorej došlo k prístupu, a hodnotu, ktorú sa tejto vlastnosti pokúšajú nastaviť:

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

Otestujme fungovanie našej triedy:

index.php<?php
  $test = new Test;
  $test->prop = 'value'; // var_dump metódy __set vypíše 'prop value'
?>

Skúsme teraz nastaviť hodnotu vlastnosti, ktorej názov je uložený v premennej $property:

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

Teraz môžeme zapisovať do privátnych vlastností zvonku triedy:

index.php<?php
  $test = new Test;
  
  $test->prop1 = 1; // zapíšeme 1
  $test->prop2 = 2; // zapíšeme 2
?>

Zapisovať môžeme, avšak skontrolovať, či sa tam niečo zapisalo - nie, pretože vlastnosti sú privátne.

Môžeme vytvoriť getter pre tieto vlastnosti alebo jednoducho použiť kúzelnú metódu __get. Využime druhú možnosť:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
    
    public function __set($property, $value)
    {
      $this->$property = $value;
    }
    
    // Kúzelný getter vlastností:
    public function __get($property)
    {
      return $this->$property;
    }
  }
?>

Až teraz môžeme skontrolovať fungovanie našej triedy. Skontrolujme:

index.php<?php
  $test = new Test;
  
  $test->prop1 = 1; // zapíšeme 1
  $test->prop2 = 2; // zapíšeme 2
  
  echo $test->prop1; // vypíše 1
  echo $test->prop2; // vypíše 2
?>

Samozrejme, v skutočnosti by sme nemali dovoliť komukoľvek zapisovať do privátnych vlastností, inak stráca zmysel ich súkromný charakter (jednoduchšie je urobiť ich verejnými a hotovo).

Preto by sa táto metóda mala používať iba vtedy, keď je to naozaj potrebné. V nasledujúcich lekciách si ešte rozoberieme príklady úspešného použitia.