I am trying to figure out how to catch any method called on an object in PHP. I know about the magic function __call, but it is triggered only for methods that do not exist on the called object.
For example i have something like this:
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   } }   And when i do this:
$foo = new Foo(); $foo->bar();   I want this output:
Calling method bar foobar   instead of this one:
foobar   Is there any way how to do this? Help please :)
Taking your original Foo implementation you could wrap a decorator around it like this:
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(); 
                        You can wrap an object around the object, intercepting any calls then forwarding them on the original object and returning the result.
Just store the object as a variable in your wrapper class and use overloading methods in your wrapper class to call/set/get/check on the object.
$object = new AnyObject; $object = new Wrapper($object);  $object->anyMethod(); $object->anyVar = 'test'; echo $object->anyVar; echo $object['array form'];   Looping the wrapper class in foreach is probably harder. Havent tried that.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With