Это сообщение не конкретно о __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?