Це повідомлення не конкретно про __get
і __set
а __call
що та ж ідея методу виклику , за винятком. Як правило, я тримаюсь подалі від будь-яких магічних методів, які дозволяють перевантажуватись з причин, викладених у коментарях та дописах ТАКОЖ , я нещодавно наткнувся на сторонній API, який я використовую, який використовує SERVICE та SUB-SERVICE, наприклад :
http://3rdparty.api.com?service=APIService.doActionOne&apikey=12341234
Важливою частиною цього є те, що в цьому API є все те саме, крім суб-дії doActionOne
. Ідея полягає в тому, що розробник (я та інші користувачі цього класу) могли викликати під-службу по імені на відміну від чогось типу:
$myClass->doAction(array('service'=>'doActionOne','args'=>$args));
Я міг би зробити це:
$myClass->doActionOne($args);
Для жорсткого коду це було б дуже багато дублювання (цей приклад дуже вільно нагадує код):
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();
}
Але за допомогою магічного методу __call()
я можу отримати доступ до всіх служб динамічними методами:
public function __call($name, $arguments)
{
$this->args = $arguments;
$this->response = $this->executeCoreCall("APIService.{$name}");
return $this;
}
Перевага цього динамічного виклику повернення даних полягає в тому, що якщо постачальник додає ще одну підпослугу, мені не доведеться додавати інший метод до класу чи створювати розширений клас тощо. Я не впевнений, чи корисно це для хтось небудь, але я вважав , що я б показати приклад , де __set
, __get
, __call
і т.д. , може бути варіантом для розгляду , так як основна функція є поверненням даних.
Редагувати:
Випадково я побачив це через кілька днів після публікації, що окреслює саме мій сценарій. Це не API, про який я мав на увазі, але застосування методів ідентичне:
Чи правильно я використовую api?