Как создать метод, который вызывается каждый раз при вызове публичного метода?

Как создать метод, который вызывается каждый раз при вызове публичного метода? Вы также можете сказать, что это вызов-метод-вызов.

Мой текущий код:

<?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();