Я работаю над функцией-оберткой вокруг существующего класса.
<?php
class wrapper extends client {
public function __call($name,$args) {
var_dump($name);
var_dump($args);
}
}
$client = new wrapper();
$client->users()->foobar();
?>
И мне ответ таков:
string(5) "users"array(0) {
}
Моя цель — записать, какая функция вызывается и с параметрами.
Как я могу видеть, что функция foobar () в классе пользователей была вызвана. А не только «пользователи»? Есть ли правильный способ сделать это правильно?
То, что вы пытаетесь сделать, это реализовать декоратор Шаблон, а не просто расширить класс. Это очень легко, так как у нас есть те магические методы, которые вы уже использовали. Но вы пропустили две важные части в своем классе оболочки:
Ваше расширение не будет работать как волшебство __вызов Метод вызывается только в том случае, если у класса нет метода с указанным именем. Так что вам нужен класс Wrapper Decorator, который не имеет этих методов.
Образец:
class BetterWrapper {
protected $child;
public function __construct(){
$this->child = new Client();
}
public function __call($name,$args) {
var_dump($name);
var_dump($args);
return call_user_func_array(array($this->child, $name), $args);
}
}
Попробуйте это вместо этого.
Смотрите этот документ для механики метода __call: http://php.net/manual/en/language.oop5.overloading.php#object.call
Других решений пока нет …