Adiós a los Getters y Setters: Domina los Property Hooks en PHP

Adiós a los Getters y Setters: Domina los Property Hooks en PHP

  • Ruben
Si llevas tiempo programando en PHP, conoces el ritual: crear una propiedad privada y luego escribir manualmente (o generar con el IDE) métodos getAlgo() y setAlgo(). Es código repetitivo ("boilerplate") que ensucia nuestras clases.

Con la llegada de PHP 8.4, esto cambia radicalmente gracias a los Property Hooks.

¿Qué son los Property Hooks?

Los Property Hooks permiten definir lógica directamente en las propiedades de una clase para controlar qué sucede cuando se lee o se escribe en ellas. Se inspiran en lenguajes como C# o Kotlin, permitiendo que las propiedades se comporten de forma inteligente sin necesidad de métodos adicionales.

Los dos hooks principales:
  • get: Se ejecuta cuando accedes al valor ($obj->propiedad).
  • set: Se ejecuta cuando asignas un valor ($obj->propiedad = 'valor').

Ejemplos Prácticos

1. Transformación de datos al asignar (Hook set)
Imagina que siempre quieres que el nombre de un usuario se guarde con la primera letra en mayúscula. Antes necesitabas un setter; ahora lo haces así:

class User {
    public string $name {
        set {
            $this->name = ucfirst(strtolower($value));
        }
    }
}

$user = new User();
$user->name = "jUAN pÉrEz";
echo $user->name; // Salida: Juan pérez
Nota: $value es el nombre automático de la variable que recibe el hook set.

2. Propiedades calculadas (Hook get)
¿Necesitas un campo que dependa de otros? El hook get es perfecto para valores derivados que no necesitan ocupar espacio extra en la memoria.

class Product {
    public function __construct(
        public float $price,
        public float $discount = 0
    ) {}

    public float $finalPrice {
        get => $this->price - $this->discount;
    }
}

$p = new Product(100, 20);
echo $p->finalPrice; // Salida: 80

3. Validación integrada
Puedes usar los hooks para proteger la integridad de tus datos de forma elegante:

class BankAccount {
    public float $balance {
        set {
            if ($value < 0) {
                throw new InvalidArgumentException("El saldo no puede ser negativo");
            }
            $this->balance = $value;
        }
    }
}

Diferencias clave con __get y __set
Muchos desarrolladores preguntan: "¿No es esto lo mismo que los métodos mágicos?". La respuesta es no.

Característica                            Métodos Mágicos (__get/__set)                         Property Hooks (PHP 8.4)
Especificidad                         Se aplican a toda la clase (catch-all).           Se definen propiedad por propiedad.
Rendimiento                           Más lentos debido a la llamada dinámica.     Más rápidos y optimizados por el motor.
Tipado                                      Difícil de tipar correctamente.                         Soportan tipado nativo de PHP.
Herramientas                        Los IDE a veces sufren para detectarlos.       Autocompletado y análisis estático total.

Reglas de Oro
  • No puedes usar hooks en propiedades readonly: Ya que el hook implica que la propiedad tiene una lógica dinámica de escritura o lectura.
  • Propiedades virtuales: Si un hook get no hace referencia a $this->propiedad, la propiedad no ocupa espacio en memoria (es "virtual").
  • Interfaces: ¡Sí! Puedes definir hooks en interfaces para obligar a que las clases implementen ciertas lógicas de lectura/escritura.

Conclusión
Los Property Hooks hacen que el código sea más limpio, legible y fácil de mantener. Reducen drásticamente la cantidad de líneas en nuestras entidades y modelos de datos, manteniendo toda la potencia de la validación y transformación de datos.

¿Estás listo para actualizar tus proyectos a PHP 8.4 y limpiar tus clases de getters y setters innecesarios?

  • Desarrollo
  • PHP
Deja un comentario: