我有一个名为 ClassA 的绘图 PHP 类,它由许多其他绘图类(例如 ClassB)扩展。
我需要继承的类来触发其父类的 Draw() 方法。但是,在我的特定情况下,我不想直接调用此类方法(例如:parent::Draw()
)。我想要第三个函数(例如:parent::InvokeDraw()
)从父级上下文中调用我的绘图方法。
下面是一些代码来说明:
class ClassA
{
function Draw()
{
/* Drawing code ... */
}
function InvokeDraw()
{
$this->Draw();
}
}
class ClassB extends ClassA
{
function Draw()
{
parent::InvokeDraw();
/* Drawing code ... */
}
}
我面临的问题是 InvokeDraw() 不会调用父类的 Draw() 方法,而是调用扩展类自己的 Draw( ) 方法,从而导致无限循环。
尽管这个问题相当合乎逻辑,但我很难找到解决方法。如何完成这个任务?
期望的效果
无限循环问题
最佳答案
从表面上看,继承的作用就像合并代码。继承的方法是子类的一部分,就好像它们是该类的 native 一样:
class A {
public function foo() {
echo 'foo';
}
public function bar() {
echo 'bar';
}
}
class B extends A { }
对于所有意图和目的,这相当于编写:
class B {
public function foo() {
echo 'foo';
}
public function bar() {
echo 'bar';
}
}
类B
具有函数foo
和bar
,就好像它们是其声明的一部分一样。
重写子类中的方法会将一个特定实现替换为另一个特定实现:
class B extends A {
public function bar() {
echo 'baz';
}
}
这就好像 B
是这样声明的:
class B {
public function foo() {
echo 'foo';
}
public function bar() {
echo 'baz';
}
}
有一个异常(exception):父级方法的实现可以使用 parent
关键字获得。它不会改变代码执行的上下文,只是使用父方法的实现:
class B extends A {
public function bar() { public function bar() {
parent::bar(); ---> echo 'bar';
} }
}
它在 B
当前实例的相同上下文中工作,它只是将父级的旧代码从以太中拉出。
如果在父类方法中调用另一个方法,它将在子类的上下文中执行,而不是在父类的上下文中执行。因为您尚未实例化父级,所以您正在处理子级。使用属性进行演示(与方法的工作原理相同):
class A {
protected $value = 'bar';
public function bar() {
echo $this->value;
}
}
class B extends A {
protected $value = 'baz';
public function bar() {
parent::bar(); // outputs "baz"
echo $this->value; // outputs "baz"
}
}
因此,您的问题无法解决。您不能在“父上下文”中调用方法。您可以在当前上下文中调用父级的代码,仅此而已。您正在创建的是一个简单的循环,因为代码是否继承并不重要,它们都在同一上下文中工作。
您需要重新设计该类,以便不在循环中调用方法。
关于php - 在 PHP 中从父级上下文访问父级的重写方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13874950/