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:
<?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:
<?php
class Test
{
private $prop1;
private $prop2;
public function __set($property, $value)
{
var_dump($property . ' ' .$value);
}
}
?>
Comprobemos el funcionamiento de nuestra clase:
<?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:
<?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:
<?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:
<?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:
<?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.