Todos los artículos

Los Hooks de propiedades están más cerca de convertirse en una realidad en PHP 8.4

Julian Beaujardin
Julian Beaujardin Reference: Laravel News April 30th, 2024

El RFC Property Hooks superó un hito significativo, obteniendo 34 votos "sí" abrumadoramente positivos y sólo 1 voto "no". Eso está muy por encima de la mayoría de 2/3 requerida para ser aprobada.

¿Qué son los hooks de propiedades en PHP?

Aquí está el resumen de la propuesta del RFC:

Los desarrolladores suelen utilizar métodos para ajustar y proteger el acceso a las propiedades de los objetos. Hay varios patrones muy comunes para dicha lógica, que en la práctica puede resultar complicado implementar repetidamente. Alternativamente, los desarrolladores pueden usar __get y __set para interceptar lecturas y escrituras genéricamente, pero ese es un enfoque que intercepta todas las propiedades no definidas (y algunas definidas) incondicionalmente. Los hooks de propiedades proporcionan una herramienta más específica y diseñada específicamente para interacciones de propiedad comunes...

Este RFC introduce dos "hooks" para anular el comportamiento predeterminado de "get" y "set" de una propiedad. Aunque no está incluido en esta versión inicial, el diseño incluye la capacidad de soportar más hooks en el futuro...

Los hooks de propiedades están inspirados en lenguajes como Kotlin, C# y Swift, y la sintaxis incluye dos variantes de sintaxis que se asemejan a cierres cortos y de varias líneas:

class User implements Named
{
    private bool $isModified = false;

    public function __construct(
        private string $first,
        private string $last
    ) {}

    public string $fullName {
        // Override the "read" action with arbitrary logic.
        get => $this->first . " " . $this->last;

        // Override the "write" action with arbitrary logic.
        set {
            [$this->first, $this->last] = explode(' ', $value, 2);
            $this->isModified = true;
        }
    }
}

La sintaxis no requiere que ambos hooks estén siempre definidos juntos; de hecho, aquí hay un ejemplo en el que se define únicamente "conjunto" desde el RFC:

class User
{
    public string $name {
        set {
            if (strlen($value) === 0) {
                throw new ValueError("Name must be non-empty");
            }
            $this->name = $value;
        }
    }

    public function __construct(string $name) {
        $this->name = $name;
    }
}

Puede leer todos los detalles sobre Property Hooks en PHP en el RFC. Es probable que esta característica se incluya en PHP 8.4. La implementación ya es un borrador de solicitud de extracción si desea ver la discusión y el progreso de esta función.