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.