【问题标题】:Calling the first declaration of foo from an extended class that declares it's own foo从声明它自己的 foo 的扩展类调用 foo 的第一个声明
【发布时间】:2010-10-25 09:14:31
【问题描述】:
<?php
class a {
    public function foo() {
        echo __METHOD__ . PHP_EOL;
    }
}
class b extends a {
    public function foo() {
        $this->foo(); # I want to call a's foo method here.
        echo __METHOD__ . PHP_EOL;
    }
}
class c extends a {
    public function foo() {
        echo __METHOD__ . PHP_EOL;
        $this->foo(); # I want to call a's foo method here.
    }
}
class d extends a {
    # This class does not handle anything super special in our foo step, so I don't over write a's foo();
}
$a = new a; $a->foo();
$b = new b; $b->foo();
$c = new c; $c->foo();
$d = new d; $d->foo();
?>

我相信你们中的一些人会摸不着头脑,想弄清楚为什么我会想做这样的事情,所以我向你保证这会说得通,让我解释一下。

我有一个自己工作得很好的函数,我还有一些其他类在基类上扩展以向它添加一些函数,这些类执行相同的任务,但在不同的上下文中或具有附加信息,因此它们必须完成父类的所有步骤,但在某些情况下它们还必须完成一些特殊的子集。

有没有办法我仍然可以执行 a 的 foo 方法和我的子类 foo 方法?

我知道我可以通过一些可怕的技巧来解决这个问题,比如将方法设为文件,然后在需要时将该文件包含在父函数和它的兄弟姐妹中,或者我可以创建第二个名为 bar() 的方法,该方法将包含foo() 的指令并让我的子类覆盖 foo() 但在需要 foo() 的功能时调用 bar()。我只是想知道我是否可以在不使用一些非常有趣的 hack 的情况下做到这一点,这里有人可以教我一些我不知道的 PHP 吗?

【问题讨论】:

    标签: php class extends


    【解决方案1】:

    你可以试试 parent::foo();

    在c类中:

    public function bar(){
      return parent::foo();
    }
    

    Example 3 in the PHP Manual on Scope Resolution

    【讨论】:

    • 好吧,我很确定我试过了,PHP 搞砸了,但我肯定会再试一次。谢谢!
    • 这次成功了,所以我一定是第一次做错了什么。
    猜你喜欢
    • 1970-01-01
    • 2011-04-24
    • 2013-07-06
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2012-10-17
    • 2012-04-22
    • 1970-01-01
    相关资源
    最近更新 更多