Snimanje svojstava kroz magiju u OOP u PHP

Magična metoda __set se poziva prilikom pokušaja promene vrednosti nepostojećeg ili skrivenog svojstva. Kao parametre prihvata ime svojstva i vrednost koju mužemo pokušavamo da mu dodelimo.

Pogledajmo na praktičnom primeru. Neka nam je dat ovakva klasa Test:

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

Hajde da napravimo u ovoj klasi magičnu metodu __set, koja će pomoću funkcije var_dump ispisivati ime svojstva, na koje je došlo pozivanje, i vrednost, koju tom svojstvu pokušavamo da postavimo:

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

Proverimo rad naše klase:

index.php<?php
  $test = new Test;
  $test->prop = 'vrednost'; // var_dump metode __set će ispisati 'prop vrednost'
?>

Hajde sada da postavljamo vrednost svojstvu čije je ime sačuvano u promenljivoj $property:

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

Sada ćemo moći da upisujemo u privatna svojstva spolja iz klase:

index.php<?php
  $test = new Test;
  
  $test->prop1 = 1; // upisaćemo 1
  $test->prop2 = 2; // upisaćemo 2
?>

Upisivati možemo, međutim, proveriti da li je nešto upisano tamo - ne možemo, jer su svojstva privatna.

Možemo napraviti geter za ova svojstva ili jednostavno iskoristiti magičnu metodu __get. Iskoristićemo drugu opciju:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
    
    public function __set($property, $value)
    {
      $this->$property = $value;
    }
    
    // Magični geter svojstava:
    public function __get($property)
    {
      return $this->$property;
    }
  }
?>

E sad možemo da proverimo rad naše klase. Proverimo:

index.php<?php
  $test = new Test;
  
  $test->prop1 = 1; // upisaćemo 1
  $test->prop2 = 2; // upisaćemo 2
  
  echo $test->prop1; // ispisaće 1
  echo $test->prop2; // ispisaće 2
?>

Zapravo, naravno, ne treba dozvoljavati svakome da upisuje u privatna svojstva, inače nestaje suština tih privatnih svojstava (lakše je učiniti ih javnim i to je sve).

Stoga ovu metodu treba primenjivati samo kada zaista postoji potreba. U narednim lekcijama ćemo još razmotriti primere uspešne primene.