Este post não é especificamente sobre __get
e __set
sim __call
que é a mesma idéia, exceto para chamadas de método. Como regra geral, eu me afasto de qualquer tipo de método mágico que permita sobrecarga por motivos descritos nos comentários e postagens , NO ENTANTO , recentemente, deparei-me com uma API de terceiros que utilizo, que usa um SERVICE e um SUB-SERVICE, por exemplo :
http://3rdparty.api.com?service=APIService.doActionOne&apikey=12341234
A parte importante disso é que essa API tem tudo a mesma coisa, exceto a sub-ação, neste caso doActionOne
. A ideia é que o desenvolvedor (eu e outros usuários dessa classe) possa chamar o sub-serviço pelo nome, em vez de algo como:
$myClass->doAction(array('service'=>'doActionOne','args'=>$args));
Eu poderia fazer:
$myClass->doActionOne($args);
Para codificar isso seria apenas muita duplicação (este exemplo se parece muito com o código):
public function doActionOne($array)
{
$this->args = $array;
$name = __FUNCTION__;
$this->response = $this->executeCoreCall("APIService.{$name}");
}
public function doActionTwo($array)
{
$this->args = $array;
$name = __FUNCTION__;
$this->response = $this->executeCoreCall("APIService.{$name}");
}
public function doActionThree($array)
{
$this->args = $array;
$name = __FUNCTION__;
$this->response = $this->executeCoreCall("APIService.{$name}");
}
protected function executeCoreCall($service)
{
$cURL = new \cURL();
return $cURL->('http://3rdparty.api.com?service='.$service.'&apikey='.$this->api.'&'.http_build_query($this->args))
->getResponse();
}
Mas com o método mágico de __call()
eu sou capaz de acessar todos os serviços com métodos dinâmicos:
public function __call($name, $arguments)
{
$this->args = $arguments;
$this->response = $this->executeCoreCall("APIService.{$name}");
return $this;
}
O benefício dessa chamada dinâmica para o retorno de dados é que, se o fornecedor adicionar outro sub-serviço, não preciso adicionar outro método à classe ou criar uma classe estendida etc. Não tenho certeza se isso é útil. ninguém, mas eu percebi que eu iria mostrar um exemplo onde __set
, __get
, __call
, etc. pode ser uma opção para a consideração já que a função principal é o retorno de dados.
EDITAR:
Coincidentemente, vi isso alguns dias após a publicação, descrevendo exatamente o meu cenário. Não é a API à qual eu estava me referindo, mas a aplicação dos métodos é idêntica:
Estou usando a API corretamente?