2009-07-01 13 views
15

PHP documentation mówi o magicznym następujące metody __call():Wyzwalanie __call() w PHP nawet gdy istnieje metoda

__call() jest wyzwalane podczas wywoływania metod niedostępnych w kontekście obiektu.

Czy istnieje sposób, w jaki mogę wywołać __call(), nawet jeśli istnieje metoda, zanim zostanie wywołana właściwa metoda? Czy jest jakiś inny haczyk, który mogę zaimplementować lub inny sposób, który zapewniłby tę funkcjonalność?

Jeśli to ma znaczenie, to jest dla static function (a ja naprawdę wolę używać __callStatic).

+0

Patrz także: http://stackoverflow.com/questions/3241949/how-to-catch- any-method-call-on-object-in-php – Benubird

Odpowiedz

11

Co powiesz na to, aby chronić wszystkie inne metody i przeprowadź ich przez __callStatic?

namespace test\foo; 

class A 
{ 
    public static function __callStatic($method, $args) 
    { 
     echo __METHOD__ . "\n"; 

     return call_user_func_array(__CLASS__ . '::' . $method, $args); 
    } 

    protected static function foo() 
    { 
     echo __METHOD__ . "\n"; 
    } 
} 

A::foo(); 
+0

Podoba mi się to. Będę o tym pamiętał, gdy uaktualnię do PHP 5.3. Dzięki. –

19

Dlaczego nie po prostu zrobić wszystkie swoje metody chronione i wywołać je za pomocą __call():

class bar{ 
    public function __call($method, $args){ 
     echo "calling $method"; 
     //do other stuff 
     //possibly do method_exists check 
     return call_user_func_array(array($this, $method), $args); 
    } 
    protected function foo($arg){ 
     return $arg; 
    } 
} 

$bar = new bar; 
$bar->foo("baz"); //echo's 'calling foo' and returns 'baz' 
+0

to jest idealne :) – nXqd

+0

need if (method_exists ($ this, $ method)) { – zloctb

+0

Myślę, że wszystkie chronione metody spowodowałyby dobry chaos w strukturze. Lepiej jest użyć '__call' z sprawdzeniem, czy metoda jest publiczna. –

Powiązane problemy