从基类调用继承类的父方法

God*_*win 5 php inheritance

以下示例不起作用,因为parent在类中调用时A,php会查找类的父类,A但它不存在.我宁愿这一行在Test()课堂上打电话B.

这可能吗?

(我知道这似乎是一个愚蠢的例子,但它有一个实际应用)

abstract class A {
    function CallParentTest()
    {
        return call_parent_method('Test');
    }
}

abstract class B extends A {
    function Test()
    {
        return 'test passed';
    }
}

class C extends B {
    function Test()
    {
        return $this->CallParentTest();
    }
}

$object = new C();
echo $object->Test();
Run Code Online (Sandbox Code Playgroud)

谢谢!

编辑
我将parent关键字更改为组合方法,call_parent_method因为我认为这可能让人感到困惑.我知道使用关键字无法做到这一点.

正如David Harkness指出的那样,我正在尝试实现模板方法模式,但我没有使用两个不同的方法名称,而是使用了一个.B::Test()除非替换为替代功能,否则将是默认方法.

Dav*_*ess 6

您可以使用反射来绕过重写方法的自然调用顺序.在任何上下文中,只需ReflectionMethod为您要调用的方法创建一个并调用它.您不需要从类本身执行此操作,但setAccessible(true)如果方法不公开,则需要调用.

class A {
    public function bypassOverride() {
        echo "Hi from A\n";
        $r = new ReflectionMethod('B', 'override');
        $r->invoke($this);
    }
}

class B extends A {
    public function override() {
        echo "Hi from B\n";
    }
}

class C extends B {
    public function override() {
        echo "Hi from C\n";
        $this->bypassOverride();
    }
}

$c = new C;
$c->override();
Run Code Online (Sandbox Code Playgroud)

这个输出是

Hi from C
Hi from A
Hi from B
Run Code Online (Sandbox Code Playgroud)

bypassOverride()如果你需要做很多事情,你可以使它更通用并将其移动到辅助类.