Este post no es específicamente sobre __get
y __set
sino __call
que es la misma idea, excepto para llamadas de método. Como regla general, me mantengo alejado de cualquier tipo de método mágico que permita la sobrecarga por las razones descritas en los comentarios y publicaciones SIN EMBARGO , recientemente me encontré con una API de terceros que uso que utiliza un SERVICIO y un SUBSERVICIO, por ejemplo :
http://3rdparty.api.com?service=APIService.doActionOne&apikey=12341234
La parte importante de esto es que esta API tiene todo lo mismo excepto la sub-acción, en este caso doActionOne
. La idea es que el desarrollador (yo y otras personas que usen esta clase) podría llamar al subservicio por su nombre en lugar de algo como:
$myClass->doAction(array('service'=>'doActionOne','args'=>$args));
Podría hacer en su lugar:
$myClass->doActionOne($args);
Para codificar no sería más que una gran cantidad de duplicación (este ejemplo esta muy asemeja vagamente el 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();
}
Pero con el método mágico de __call()
puedo acceder a todos los servicios con métodos dinámicos:
public function __call($name, $arguments)
{
$this->args = $arguments;
$this->response = $this->executeCoreCall("APIService.{$name}");
return $this;
}
El beneficio de esta llamada dinámica para la devolución de datos es que si el proveedor agrega otro subservicio, no tengo que agregar otro método a la clase o crear una clase extendida, etc. No estoy seguro de si esto es útil para nadie, pero pensé que podría mostrar un ejemplo donde __set
, __get
, __call
, etc. puede ser una opción para su consideración ya que la función principal es la devolución de datos.
EDITAR:
Casualmente, vi esto unos días después de la publicación, que describe exactamente mi escenario. No es la API a la que me refería, pero la aplicación de los métodos es idéntica:
¿Estoy usando la API correctamente?