Как создать метод, который вызывается каждый раз при вызове публичного метода? Вы также можете сказать, что это вызов-метод-вызов.
Мой текущий код:
<?php class Name { public function foo() { echo "Foo called\n"; } public function bar() { echo "Bar called\n"; } protected function baz() { echo "Baz called\n"; } } $name = new Name(); $name->foo(); $name->bar();
Текущий вывод в этом коде:
Foo called Bar called
Я хотел бы, чтобы метод baz () вызывался каждый раз, когда вызывался другой публичный метод. Например
Baz called Foo called Baz called Bar called
Я знаю, что мог бы сделать что-то вроде этого:
public function foo() { $this->baz(); echo "Foo called\n"; }
Но это на самом деле не решит мою проблему, потому что это не очень ортогонально, и это довольно болезненно для реализации, если бы у меня было 100 методов, которые должны были вызвать этот другой метод перед ними.
Возможно, не то, что вы ожидаете или хотите точно, но, используя магический метод __call
и отмечая защищенные или частные общедоступные методы, вы можете получить желаемый эффект:
<?php class Name { public function __call($method, $params) { if(!in_array($method, array('foo', 'bar'))) return; $this->baz(); return call_user_func_array( array($this, $method), $params); } protected function foo() { echo "Foo called\n"; } protected function bar() { echo "Bar called\n"; } protected function baz() { echo "Baz called\n"; } } $name = new Name(); $name->foo(); $name->bar();