2011-06-06 46 views
11

是否需要建立一個類,以便如果未定義某個方法,而不是拋出一個錯誤,那麼它將轉到一個捕獲所有函數?PHP - 一類中的catchall方法

這樣如果我打電話$myClass->foobar();但foobar從來沒有在類定義中設置,其他一些方法將處理它?

回答

15

是的,這是overloading

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(); 
+1

+1要添加,它是* PHP *重載,這是(莫名其妙)與其他OOP語言不同的用法。 – webbiedave 2011-06-06 16:10:16

1

Magic methods。特別是,__call()

+0

__invoke的東西比__call不同。 – akond 2011-06-06 16:07:31

+0

如果@changokun想要做'$ myclass();' – 2011-06-06 16:07:55

+0

@akond:__invoke會是答案:當然,這是我已經修復的思想差距。 – 2011-06-06 16:08:22

6

是的,您可以使用__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'