PHP - метод catchall в классе - PullRequest
13 голосов
/ 06 июня 2011

Можно ли настроить класс таким образом, чтобы, если метод не определен, вместо выдачи ошибки он перешел бы в универсальную функцию?

такое, что если я вызову $myClass->foobar();, но foobar никогда не был установлен в определении класса, какой-то другой метод будет обрабатывать это?

Ответы [ 4 ]

17 голосов
/ 06 июня 2011

Да, это перегрузка :

class Foo {
    public function __call($method, $args) {
        echo "$method is not defined";
    }
}

$a = new Foo;
$a->foo();
$b->bar();

Начиная с PHP 5.3 вы также можете делать это статическими методами:

class Foo {
    static public function __callStatic($method, $args) {
        echo "$method is not defined";
    }
}

Foo::hello();
Foo::world();
6 голосов
/ 06 июня 2011

Вы хотите использовать __ call () для перехвата вызываемых методов и их аргументов.

6 голосов
/ 06 июня 2011

Да, вы можете использовать магический метод __ call , который вызывается, когда подходящий метод не найден. Пример:

class Foo {
    public function __call($name, $args) {
         printf("Call to %s intercepted. Arguments: %s", $name, print_r($args, true));
    }
}

$foo = new Foo;
$foo->bar('baz'); // Call to bar intercepted. Arguments: string(3) 'baz'
1 голос
/ 06 июня 2011
...