Propiedades de solo lectura en POO en PHP
Consideremos una clase en la que todas las propiedades son privadas:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
}
?>
Ahora hagamos que estas propiedades en el mundo exterior sean accesibles solo para lectura. Anteriormente ya hicimos esto, creando getters para cada propiedad y sin crear setters.
Ahora resolvamos esta tarea utilizando
el método mágico __get. Devolveremos
en él el valor de la propiedad solicitada. Cómo
hacerlo: el nombre de la propiedad solicitada llega
al parámetro del método __get, en nuestro caso
$property.
Esto significa que podemos leer la propiedad,
cuyo nombre está almacenado en una variable, así:
$this->$property (el nombre de la propiedad será
una variable, es decir, con un dólar al principio, esto
lo estudiamos en lecciones anteriores).
Hagamos el método __get descrito:
<?php
class Test
{
private $prop1 = 1;
private $prop2 = 2;
public function __get($property)
{
return $this->$property;
}
}
?>
Utilicémoslo para leer las propiedades:
<?php
$test = new Test;
echo $test->prop1; // mostrará 1
echo $test->prop2; // mostrará 2
?>
El intento de escribir algo en la propiedad llevará a un error:
<?php
$test = new Test;
$test->prop1 = 2; // dará un error
?>
Esto es exactamente lo que necesitamos: la propiedad se puede leer, pero no se puede escribir.
El intento de leer una propiedad inexistente dará un error:
<?php
$test = new Test;
echo $test->prop3; // dará un error
?>
También presten atención al siguiente matiz: cuando hacíamos propiedades de solo lectura de la manera antigua, para leer la propiedad, usábamos un método getter.
En la nueva forma, nos dirigiremos precisamente a las propiedades, como si fueran públicas. Pero no podremos escribir en ellas, como si fueran privadas.
Supongamos que se da la siguiente clase User, cuyas propiedades
son accesibles solo para lectura mediante
getters:
<?php
class User
{
private $name;
private $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Rehagan el código de esta clase para que en lugar
de getters se use el método
mágico __get.