以下示例不起作用,因为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()除非替换为替代功能,否则将是默认方法.
您可以使用反射来绕过重写方法的自然调用顺序.在任何上下文中,只需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()如果你需要做很多事情,你可以使它更通用并将其移动到辅助类.