Como uso __get() e __set() do PHP para campos definidos na minha classe?
-
19-09-2019 - |
Pergunta
Eu tive uma boa leitura do Especificações PHP sobre sobrecarga, e a maioria dos exemplos parece ter como objetivo simplesmente permitir a definição de campos personalizados (semelhante a stdClass).
Mas e os campos privados definidos na minha classe?Como eles devem ser recuperados/atribuídos?Eu poderia ativar valores possíveis e agir de acordo com determinados valores:
class A
{
private $name;
private $age;
public function __get( $var )
{
switch ( $var )
{
case 'name':
return $this->name;
break;
case 'age':
return $this->age+10; // just to do something different ;)
break;
default:
break;
}
}
}
Este é o melhor método ou existe outra prática recomendada geralmente aceita?(Não sei se é possível fazer um loop de variáveis de classe dentro de uma classe, mas independentemente disso, isso não é apropriado na maioria das situações, pois você não deseja retornar tudo.)
Solução
Isso efetivamente os tornaria públicos e, geralmente, você não ganha nada com o simples uso de propriedades públicas (mas você paga uma penalidade de desempenho e precisa escrever mais código, correndo o risco de bugs).
Use isso apenas se você tiver código existente que usa propriedade pública e de repente precisar de getter/setter para isso (como seu exemplo com age
).
Se você precisar executar algum código quando a propriedade for lida/escrita (por exemplo,torná-lo somente leitura ou buscar preguiçosamente no banco de dados), então você deve usar getters/setters normais (getAge()
/setAge()
).
Outras dicas
Faço uso extensivo de __get()
e __set()
E tenho minhas propriedades declaradas public
.Eu queria o melhor dos dois mundos, para que meu IDE pudesse listar propriedades públicas para mim quando eu digitasse o nome de uma instância de classe.Como consegui que os métodos interceptadores do PHP funcionassem, mesmo que as propriedades sejam públicas e visíveis fora da classe?
unset() as propriedades Eu quero __get()
e __set()
para ser usado na aula __construct()
.
Descobrir esse método levou algumas noites de frustração :-)
Não vejo muitas pessoas usando-os, mas aqui está o que penso.
Para recuperar variáveis privadas, você provavelmente deseja fornecer uma lista de variáveis definidas que podem ser acessadas externamente.Em seguida, verifique se a variável solicitada está nesse array.Se for, permita que seja alterado/obtido.Caso contrário, erro ou retornará nulo.
Honestamente, as implementações para isso são realmente caso a caso.Se você tivesse uma classe de usuário que armazenasse todas as informações em um único array, você poderia fazer com que $user->name fosse extraído de $user->account['name'], ou algo parecido.
Além disso, caso a caso, você pode fazer algumas modificações antes de fornecer valores, como hash de uma senha.