2009-07-01 8 views
15

El PHP documentation dice lo siguiente acerca del método mágico __call():Activación __call() en PHP, incluso cuando existe método

__call() se activa cuando la invocación de métodos de difícil acceso en el contexto de un objeto.

¿Hay alguna manera de que pueda llamar a __call() incluso cuando existe un método, antes de que se llame al método real? O bien, ¿hay algún otro gancho que pueda implementar u otra forma de proporcionar esta funcionalidad?

Si es importante, esto es para un static function (y yo preferiría usar __callStatic).

+0

Ver también: http://stackoverflow.com/questions/3241949/how-to-catch- any-method-call-on-object-in-php – Benubird

Respuesta

11

¿Qué tal si proteges todos tus otros métodos y los usas a través de __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

Me gusta esto. Lo tendré en cuenta cuando actualice a PHP 5.3. Gracias. –

19

¿Por qué no hacer que todos sus métodos protegidos y llamar a ellos utilizando __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

esto es perfecto :) – nXqd

+0

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

+0

Creo que todos los métodos protegidos harían un buen caos en la estructura. Mejor es usar '__call' para verificar si el método es público. –

Cuestiones relacionadas