Property Hooks Ficam Mais Próximos de se Tornarem Realidade no PHP 8.4

Descubra como os Property Hooks vão revolucionar o PHP 8.4, permitindo maior controle sobre propriedades.

Property Hooks Ficam Mais Próximos de se Tornarem Realidade no PHP 8.4 🎉

A proposta de Property Hooks no PHP deu um passo significativo, recebendo um impressionante total de 34 votos "sim" e apenas 1 voto "não". Isso está bem acima da maioria de 2/3 necessária para aprovação.

O que são property hooks no PHP? 🤔

Aqui está o resumo da proposta do RFC:

Desenvolvedores frequentemente usam métodos para encapsular e proteger o acesso às propriedades de objetos. Existem vários padrões bastante comuns para essa lógica, que na prática podem ser verbosos para implementar repetidamente. Alternativamente, os desenvolvedores podem usar __get e __set para interceptar leituras e escritas de forma genérica, mas essa é uma abordagem bruta que intercepta todas as propriedades indefinidas (e algumas definidas) incondicionalmente. Property hooks fornecem uma ferramenta mais direcionada e feita sob medida para interações comuns com propriedades...

Este RFC introduz dois “hooks” para substituir o comportamento “get” e “set” padrão de uma propriedade. Embora não incluídos nesta versão inicial, o design inclui a capacidade de suportar mais hooks no futuro.

Os property hooks são inspirados em linguagens como Kotlin, C#, e Swift, e a sintaxe inclui duas variantes que se assemelham a closures curtas e multilinhas:


class User implements Named
{
    private bool $isModified = false;
 
    public function __construct(
        private string $first,
        private string $last
    ) {}
 
    public string $fullName {
        // Substituir a ação de "leitura" com lógica arbitrária.
        get => $this->first . " " . $this->last;
 
        // Substituir a ação de "escrita" com lógica arbitrária.
        set {
            [$this->first, $this->last] = explode(' ', $value, 2);
            $this->isModified = true;
        }
    }
}

A sintaxe não exige que ambos os hooks sejam sempre definidos juntos; na verdade, aqui está um exemplo de definição de apenas set do RFC:


<?php
class User
{
    public string $name {
        set {
            if (strlen($value) === 0) {
                throw new ValueError("O nome deve ser não vazio");
            }
            $this->name = $value;
        }
    }
 
    public function __construct(string $name) {
        $this->name = $name;
    }
}
    

Você pode ler todos os detalhes sobre Property Hooks no PHP no RFC. Essa funcionalidade provavelmente será implementada no PHP 8.4. A implementação já é um pull request em rascunho, caso você queira ver a discussão e o progresso dessa funcionalidade.

Comentários

Nome:

Email (não será publicado):

Comentário: