DEV Community

Lucien Risso Correia
Lucien Risso Correia

Posted on

Property Hooks no PHP 8.4

Em novembro teremos o lançamento da versão 8.4 do nosso querido PHP e com ela teremos um novo recurso muito aguardado pela comunidade: o property hooks! Inspirado por outras linguagens como C#, Swift e Kotlin esse novo recurso tira a gambiarra dos métodos mágicos __set() e __get().

Vou mostrar um exemplo de como faz atualmente para termos getter e setters sem precisar criar a propriedade como privativa e criar dois novos métodos com nomes diferentes da propriedades.


class Foo
{
    private String $bar;

    public function __set($name, $value)
    {
        $this->$name = $value . "!!!"; 
    }

    public function __get($name)
    {
         return "!!!" . $this->$name;
    }
}
Enter fullscreen mode Exit fullscreen mode

Usando o __get() e __set() consigo deixar o $bar público quando defino valor e quando busco o valor, porém com implementação diferente e sem ter que criar métodos com nomes distintos da propriedade. Em exemplo visual ficaria assim o uso:


$foo = new Foo();

$foo->bar = "new release";
// aqui o valor que ficará salvo seria "new release!!!"

echo $foo->bar; // aqui retornaria "!!!new release!!!"
Enter fullscreen mode Exit fullscreen mode

Agora imagine como ficaria o __get() e __set() com outras propriedades, uma confusão total. Outra maneira de fazer isso seria criando um método getBar() e um outro setBar(), mas isso considerando apenas uma propriedade e no uso ficaria diferente do anterior:

class Foo
{
    private String $bar;

    public function setBar($value)
    {
        $this->bar = $value . "!!!"; 
    }

    public function getBar()
    {
         return "!!!" . $this->bar;
    }
}

$foo = new Foo();

$foo->setBar('new release');
// aqui o valor que ficará salvo seria "new release!!!"

echo $foo->getBar(); // aqui retornaria "!!!new release!!!"
Enter fullscreen mode Exit fullscreen mode

Eu particularmente acho meio chato criar novos métodos para esse caso de uso, prefiro muito usar a chamada direta da propriedade tanto para pegar quando definir seu valor. Esse novo recurso chega para resolver essa bagunça e permitir definir o get e set individualmente junto com a declaração na classe.


class Foo
{
    public String $bar {
        set (String $value) => $this->bar = $value . "!!!";
        get => "!!! . $this->bar";
    }
}

Enter fullscreen mode Exit fullscreen mode

Esse novo código faz a mesma coisa porém individualmente, sem criar novos métodos ou utilizar __get() e __set() que precisam de tratamento para cada propriedade e a classe tiver.

Agora é só aguardar o lançamento desse novo recurso que deverá sair dia 21 de novembro!

Top comments (0)