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;
}
}
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!!!"
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!!!"
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";
}
}
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)