Scrittura delle proprietà tramite magia in OOP in PHP

Il metodo magico __set viene richiamato quando si tenta di modificare il valore di una proprietà inesistente o nascosta. Accetta come parametri il nome della proprietà e il valore che si sta tentando di assegnarle.

Vediamo un esempio pratico. Supponiamo di avere questa classe Test:

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

Creiamo in questa classe il metodo magico __set, che utilizzando la funzione var_dump visualizzerà il nome della proprietà a cui si è tentato di accedere e il valore che si sta tentando di impostare per quella proprietà:

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

Verifichiamo il funzionamento della nostra classe:

index.php<?php
  $test = new Test;
  $test->prop = 'value'; // var_dump del metodo __set visualizzerà 'prop value'
?>

Ora impostiamo il valore alla proprietà il cui nome è memorizzato nella variabile $property:

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

Ora potremo scrivere nelle proprietà private dall'esterno della classe:

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

Possiamo scrivere, tuttavia, verificare se ciò che abbiamo scritto è stato memorizzato - no, poiché le proprietà sono private.

Si può creare un getter per queste proprietà o semplicemente utilizzare il metodo magico __get. Utilizziamo la seconda opzione:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
    
    public function __set($property, $value)
    {
      $this->$property = $value;
    }
    
    // Getter magico per le proprietà:
    public function __get($property)
    {
      return $this->$property;
    }
  }
?>

Ora possiamo verificare il funzionamento della nostra classe. Verifichiamo:

index.php<?php
  $test = new Test;
  
  $test->prop1 = 1; // scriveremo 1
  $test->prop2 = 2; // scriveremo 2
  
  echo $test->prop1; // visualizzerà 1
  echo $test->prop2; // visualizzerà 2
?>

In realtà, ovviamente, non è consigliabile permettere a chiunque di scrivere nelle proprietà private, altrimenti si perde il senso stesso di queste proprietà private (sarebbe più semplice renderle pubbliche e basta).

Pertanto, questo metodo dovrebbe essere utilizzato solo quando ce n'è effettivamente necessità. Nelle prossime lezioni vedremo altri esempi di applicazione efficace.