In diesem Beitrag geht es nicht speziell um __get
und __set
sondern um __call
die gleiche Idee, außer für den Methodenaufruf. In der Regel halte ich mich von jeglichen magischen Methoden fern, die aus den in den Kommentaren und Beiträgen genannten Gründen eine Überladung ermöglichen. JEDOCH bin ich kürzlich auf eine Drittanbieter-API gestoßen , die ich verwende und die beispielsweise einen SERVICE und einen SUB-SERVICE verwendet ::
http://3rdparty.api.com?service=APIService.doActionOne&apikey=12341234
Der wichtige Teil davon ist, dass diese API bis auf die Unteraktion in diesem Fall alles gleich hat doActionOne
. Die Idee ist, dass der Entwickler (ich und andere, die diese Klasse verwenden) den Subdienst beim Namen nennen könnte, im Gegensatz zu etwas wie:
$myClass->doAction(array('service'=>'doActionOne','args'=>$args));
Ich könnte stattdessen tun:
$myClass->doActionOne($args);
Das Hardcodieren wäre nur eine Menge Duplizierung (dieses Beispiel ähnelt dem Code sehr stark):
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();
}
Aber mit der magischen Methode von kann __call()
ich mit dynamischen Methoden auf alle Dienste zugreifen:
public function __call($name, $arguments)
{
$this->args = $arguments;
$this->response = $this->executeCoreCall("APIService.{$name}");
return $this;
}
Der Vorteil dieser dynamischen Aufforderung zur Rückgabe von Daten besteht darin, dass ich, wenn der Anbieter einen weiteren Unterdienst hinzufügt, der Klasse keine weitere Methode hinzufügen oder eine erweiterte Klasse usw. erstellen muss. Ich bin mir nicht sicher, ob dies nützlich ist jemand, aber ich dachte , ich würde ein Beispiel zeigen , wo __set
, __get
, __call
etc. eine Option zur Prüfung sein kann , da die primäre Funktion die Rückgabe von Daten ist.
BEARBEITEN:
Zufälligerweise habe ich dies einige Tage nach der Veröffentlichung gesehen, was genau mein Szenario beschreibt. Es ist nicht die API, auf die ich mich bezog, aber die Anwendung der Methoden ist identisch:
Benutze ich API richtig?