2012-11-23 190 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