Pregunta

Estoy tratando de averiguar cómo atrapar a cualquier método llamado sobre un objeto en PHP.Yo sé acerca de la magia de la función __call, pero es activa sólo para los métodos que no existen en el objeto al que se llama.

Por ejemplo yo tengo algo como esto:

class Foo
{
  public function bar()
  {
    echo 'foobar';
  }

  public function override($method_name,$method_args)
  {
    echo 'Calling method ',$method_name,'<br />';
    $this->$method_name($method_args); //dirty, but working
  }
}

Y cuando hago esto:

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

Quiero que esta salida:

Calling method bar
foobar

en lugar de esto:

foobar

Es allí cualquier manera de cómo hacerlo?Ayuda por favor :)

¿Fue útil?

Solución

Tomando su original Foo aplicación usted podría ajustar un decorator alrededor de ella, como esta:

class Foo 
{
    public function bar() {
        echo 'foobar';
    }
}

class Decorator 
{
    protected $foo;

    public function __construct(Foo $foo) {
       $this->foo = $foo;
    }

    public function __call($method_name, $args) {
       echo 'Calling method ',$method_name,'<br />';
       return call_user_func_array(array($this->foo, $method_name), $args);
    }
}

$foo = new Decorator(new Foo());
$foo->bar();

Otros consejos

Puede envolver un objeto alrededor del objeto, interceptar cualquier llamada y luego reenviarlos en el objeto original y devolver el resultado.

Solo almacene el objeto como una variable en su clase de envoltura y use los métodos de sobrecarga en su clase de envoltura para llamar / configurar / obtener / verificar en el objeto.

$object = new AnyObject;
$object = new Wrapper($object);

$object->anyMethod();
$object->anyVar = 'test';
echo $object->anyVar;
echo $object['array form'];

Bucle La clase de envoltura en foreach es probablemente más difícil.No he intentado eso.

Si establece la función para privar, la llamada atrapará cualquier llamada desde el exterior quedará atrapada en __call, pero puede llamarlo desde el interior

class Foo
{
   private function bar()
   {
      echo 'foobar';
   }

   public function __call($method_name,$method_args)
   {
      echo 'Calling method ',$method_name,'<br />';
      $this->$method_name(); //dirty, but working
   }
}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top