2010-07-13 53 views
21

我想弄清楚如何捕捉任何方法調用在PHP中的對象。我知道魔術功能__call,但它只會觸發調用對象上不存在的方法。如何在PHP中捕獲對象的任何方法調用?

例如,我有這樣的事情:

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 
    } 
} 

當我這樣做:

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

我想這樣的輸出:

Calling method bar 
foobar 

,而不是這一個:

foobar 

有沒有辦法如何做到這一點?請幫助:)

回答

38

以你原來Foo實現,你可以環繞它decorator這樣的:

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(); 
+0

感謝隊友,多數民衆贊成正是我需要的:) – Pirozek 2010-07-13 22:32:14

+0

一種情況下,這將無法正常工作,如果你有方法,期望'Foo',例如'someMethod(Foo $ foo)'' – 2017-02-11 00:55:50

2

您可以在對象周圍包圍對象,攔截任何調用,然後在原始對象上轉發它們並返回結果。

只需將對象作爲變量存儲在包裝類中,並在包裝​​類中使用重載方法調用/設置/獲取/檢查對象。

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

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

在foreach中循環包裝類可能會更困難。沒有嘗試過。

+0

你能更具體的嗎?只是一個小例子:) – Pirozek 2010-07-13 22:21:29

+0

謝謝隊友,這幫了我。 – Pirozek 2010-07-13 22:39:18

相關問題