php - 在 PHP 中从父级上下文访问父级的重写方法

标签 php class

我有一个名为 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( ) 方法,从而导致无限循环。

尽管这个问题相当合乎逻辑,但我很难找到解决方法。如何完成这个任务?

期望的效果

chart

无限循环问题

chart

最佳答案

从表面上看,继承的作用就像合并代码。继承的方法是子类的一部分,就好像它们是该类的 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具有函数foobar,就好像它们是其声明的一部分一样。

重写子类中的方法会将一个特定实现替换为另一个特定实现:

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/

相关文章:

php - JSON 对象的索引数组元素

c++ - 按私有(private)成员对自定义对象进行排序

php - 使用 php 在数据库中自动增加表的下一个

php - <? PHP 回显 ("<pre>"); ..... 回显 ("</pre>"); ?> 是什么意思?

php - 使用 PHP DOMXpath 遍历子节点?

javascript - Google 图表导出为图像

java - 使用自定义 LinkedList 类的薪资系统

python - 如何确定一个类的元类?

javascript - jQuery - 通过 event.target 属性获取元素的类

JQuery:遍历具有多个仅共享第一个类名的 css 类名的元素