1

我有以下代码:

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';

现在,当调用 test() 时,输出是:Hello world。但我希望它首先回显:Hello world,然后我想回显:Hello of the parent 而无需在 A 类中声明测试方法。

我该如何解决这个问题?

编辑:

对不起,也许我不够清楚,对我来自荷兰的糟糕英语感到抱歉,我想要的是当一个孩子的方法被调用时,父类得到被调用的孩子方法的名称。

4

3 回答 3

4

__call 是一个重载函数。这意味着当没有定义公共函数时将被调用!!!

所以要打招呼,只需调用任何其他未定义的函数

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

只会给你打招呼。

于 2012-11-23T16:36:20.293 回答
0

你可以parent::test()这样称呼:

class B extends A {

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

输出:

Hello WorldHello
于 2012-11-23T16:37:27.790 回答
-1

您可以将 __call 重命名为 test 并在子测试开始时调用 parent::test() 。

没有办法自动执行此操作。

还要指出,如果你用两个下划线命名 __call,访问修饰符应该是私有的,而 _call 是受保护的。

于 2012-11-23T16:39:52.007 回答