Scrierea proprietăților prin magie în OOP în PHP

Metoda magică __set este apelată la încercarea de a modifica valoarea unei proprietăți inexistente sau ascunse. Ca parametri primește numele proprietății și valoarea, care îi este încercată asignarea.

Să analizăm un exemplu practic. Să presupunem că avem următoarea clasă Test:

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

Să creăm în această clasă o metodă magică __set, care cu ajutorul funcției var_dump va afișa numele proprietății, căreia i s-a făcut accesul, și valoarea, care a fost încercată a fi setată pentru această proprietate:

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

Să verificăm funcționarea clasei noastre:

index.php<?php
  $test = new Test;
  $test->prop = 'value'; // var_dump din metoda __set va afișa 'prop value'
?>

Acum să setăm valoarea proprietății, al cărei nume este stocat în variabila $property:

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

Acum vom putea scrie în proprietățile private din afara clasei:

index.php<?php
  $test = new Test;
  
  $test->prop1 = 1; // vom scrie 1
  $test->prop2 = 2; // vom scrie 2
?>

Putem scrie, însă, să verificăm dacă ceva s-a scris acolo - nu, deoarece proprietățile sunt private.

Se poate face un getter pentru aceste proprietăți sau se poate folosi metoda magică __get. Să folosim a doua variantă:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
    
    public function __set($property, $value)
    {
      $this->$property = $value;
    }
    
    // Getter magic pentru proprietăți:
    public function __get($property)
    {
      return $this->$property;
    }
  }
?>

Acum putem verifica funcționarea clasei noastre. Să verificăm:

index.php<?php
  $test = new Test;
  
  $test->prop1 = 1; // vom scrie 1
  $test->prop2 = 2; // vom scrie 2
  
  echo $test->prop1; // va afișa 1
  echo $test->prop2; // va afișa 2
?>

De fapt, desigur, nu ar trebui să permitem oricine să scrie în proprietățile private, altfel se pierde sensul acestor proprietăți private (este mai ușor să le faci publice și atât).

Prin urmare, această metodă trebuie aplicată doar atunci când există cu adevărat nevoie. În lecțiile următoare vom analiza și exemple de aplicare cu succes.