Escritura de propiedades mediante magia en POO en PHP

El método mágico __set se llama al intentar cambiar el valor de una propiedad inexistente o inaccesible. Acepta como parámetros el nombre de la propiedad y el valor que se intenta asignarle.

Veamos un ejemplo práctico. Supongamos que tenemos esta clase Test:

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

Creemos en esta clase el método mágico __set, que mediante la función var_dump mostrará el nombre de la propiedad a la que se accedió y el valor que se intenta establecer para esa propiedad:

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

Comprobemos el funcionamiento de nuestra clase:

index.php<?php
  $test = new Test;
  $test->prop = 'value'; // var_dump del método __set mostrará 'prop value'
?>

Ahora asignemos un valor a la propiedad cuyo nombre está almacenado en la variable $property:

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

Ahora podremos escribir en las propiedades privadas desde fuera de la clase:

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

Podemos escribir, sin embargo, comprobar si se escribió algo allí - no, ya que las propiedades son privadas.

Se puede hacer un getter para estas propiedades o simplemente usar el método mágico __get. Usemos la segunda opción:

Test.php<?php
  class Test
  {
    private $prop1;
    private $prop2;
    
    public function __set($property, $value)
    {
      $this->$property = $value;
    }
    
    // Getter mágico de propiedades:
    public function __get($property)
    {
      return $this->$property;
    }
  }
?>

Ahora sí podemos comprobar el funcionamiento de nuestra clase. Comprobemos:

index.php<?php
  $test = new Test;
  
  $test->prop1 = 1; // escribiremos 1
  $test->prop2 = 2; // escribiremos 2
  
  echo $test->prop1; // mostrará 1
  echo $test->prop2; // mostrará 2
?>

En realidad, por supuesto, no se debe permitir que cualquiera escriba en las propiedades privadas, de lo contrario desaparece el sentido de esas propiedades privadas (es más fácil hacerlas públicas y listo).

Por lo tanto, este método debe aplicarse solo cuando realmente existe la necesidad. En las siguientes lecciones veremos más ejemplos de aplicación exitosa.