objetos - ¿Cómo atrapar cualquier llamada de método en objeto en PHP?
herencia en php (2)
Estoy tratando de descubrir cómo atrapar cualquier método llamado en un objeto en PHP. Conozco la función mágica __call
, pero se activa solo para los métodos que no existen en el objeto llamado.
Por ejemplo, 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 esta salida:
Calling method bar
foobar
en lugar de este:
foobar
¿Hay alguna manera de cómo hacer esto? Ayuda por favor :)
Puede envolver un objeto alrededor del objeto, interceptando cualquier llamada y luego reenviarla al objeto original y devolver el resultado.
Simplemente almacene el objeto como una variable en su clase contenedora y use métodos de sobrecarga en su clase contenedora para llamar / establecer / obtener / verificar el objeto.
$object = new AnyObject;
$object = new Wrapper($object);
$object->anyMethod();
$object->anyVar = ''test'';
echo $object->anyVar;
echo $object[''array form''];
Looping the wrapper class en foreach es probablemente más difícil. Havent lo intentó.
Tomando su implementación original de Foo
, podría envolver a un decorator
alrededor de esta manera:
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();