Ten post nie jest konkretnie o __get
a __set
raczej __call
który jest taki sam pomysł z wyjątkiem metody powołania. Z reguły trzymam się z daleka od wszelkiego rodzaju magicznych metod, które pozwalają na przeładowanie z powodów opisanych w komentarzach i postach, JEDNAK ostatnio natknąłem się na interfejs API innej firmy, którego używam, który korzysta z usługi SERVICE i SUB-SERVICE, na przykład :
http://3rdparty.api.com?service=APIService.doActionOne&apikey=12341234
Ważną częścią tego jest to, że ten interfejs API ma w tym przypadku wszystko to samo oprócz poddziałania doActionOne
. Chodzi o to, że programista (ja i inni korzystający z tej klasy) może wywołać pod-usługę z nazwy, w przeciwieństwie do czegoś takiego:
$myClass->doAction(array('service'=>'doActionOne','args'=>$args));
Mógłbym zamiast tego:
$myClass->doActionOne($args);
W przypadku kodu twardego byłoby to po prostu dużo powielania (ten przykład bardzo luźno przypomina kod):
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();
}
Ale dzięki magicznej metodzie __call()
jestem w stanie uzyskać dostęp do wszystkich usług za pomocą metod dynamicznych:
public function __call($name, $arguments)
{
$this->args = $arguments;
$this->response = $this->executeCoreCall("APIService.{$name}");
return $this;
}
Zaletą tego dynamicznego wezwania do zwrotu danych jest to, że jeśli dostawca doda inną pod-usługę, nie muszę dodawać innej metody do klasy ani tworzyć rozszerzonej klasy itp. Nie jestem pewien, czy jest to przydatne ktoś, ale pomyślałem, że pokażę przykład, w którym __set
, __get
, __call
, itd. może być opcja do rozważenia, ponieważ podstawową funkcją jest powrót danych.
EDYTOWAĆ:
Przypadkowo zobaczyłem to kilka dni po opublikowaniu, które dokładnie opisuje mój scenariusz. Nie chodzi o API, o którym mówiłem, ale zastosowanie metod jest identyczne:
Czy używam poprawnie interfejsu API?