2012-11-23 164 views
1

我有以下代碼:調用公共子方法時自動調用父類的__call?

class A 
{ 
    public function __call($method, $args) 
    { 
     echo 'Hello'; 
    } 
} 

class B extends A 
{ 
    public function test() 
    { 
     echo 'Hello world'; 
    } 
} 

$b = new B(); 
b->test(); //outputs 'Hello world'; 

現在,當調用測試()的輸出是:世界,你好。但我希望它首先回聲:你好世界,比我想回聲:你好父母沒有宣佈在A級的測試方法。

我該如何解決這個問題?

編輯:

對不起,也許我還不夠清楚,對不起我的英文不好,我從荷蘭來的,我想是當孩子的方法被調用父類獲取孩子的名方法被調用。

回答

4

__call是一個重載函數。 當沒有定義公共功能時會被調用的含義!

因此,要獲得招呼只能調用未定義

$b = new B(); 
b->notAFunction(); 

會給你好僅任何其他功能。

+0

的確如此,如果你想要一個__call函數來捕獲一個函數調用,它不能是一個公共函數。 –

0

您只需調用parent::test()這樣:

class B extends A { 

    public function test() 
    { 
     echo 'Hello world'; 
     parent::test(); 
    } 
} 

輸出:

Hello WorldHello 
+1

'parent :: anything();'會回顯hello或'$ this-> notHello()' –

+1

+1。 OP想要它顛倒過來:) –

+0

@E_p在旁註中,是否可以直接調用__call? –

-1

你可以重命名__call在孩子測試開始測試和調用parent ::試驗(+)。

沒有辦法自動執行此操作。

還想指出的是,如果您使用兩個下劃線命名__call,則訪問修飾符應該是私有的,而_call爲受保護的。

+0

你知道CakePHP嗎?它有一個autoRender變量,當它被設置爲true時,系統會自動調用自定義CakePHP控制器的父方法'render',該控制器擴展了CakePHP的默認控制器。 CakePHP如何做到這一點? – user1507868