Php 从声明foo的扩展类调用foo的第一个声明';他自己的食物

Php 从声明foo的扩展类调用foo的第一个声明';他自己的食物,php,class,extends,Php,Class,Extends,我相信你们中的一些人会挠头想弄明白我为什么会想做这样的事情,所以我向你们保证这会有意义的,让我解释一下 我有一个函数,它本身可以很好地工作,我还有一些其他的类在基类的基础上扩展,向它添加一些函数,这些类执行相同的任务,但在不同的上下文中或使用附加信息,因此它们必须执行父类的所有步骤,但在某些情况下还必须执行一些特殊的子集 有没有一种方法我仍然可以执行a的foo方法和我的子类foo方法 我知道我可以用一些可怕的技巧来解决这个问题,比如把这个方法变成一个文件,然后在需要的时候把这个文件包含在父函数和

我相信你们中的一些人会挠头想弄明白我为什么会想做这样的事情,所以我向你们保证这会有意义的,让我解释一下

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

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

我知道我可以用一些可怕的技巧来解决这个问题,比如把这个方法变成一个文件,然后在需要的时候把这个文件包含在父函数和它的兄弟函数中,或者我可以制作第二个方法,叫做bar(),它包含foo()的指令,让我的子类覆盖foo(),但调用bar()当他们需要foo()的功能时。我只是想知道,如果不使用一些非常有趣的黑客,我是否可以做到这一点,这里有人可以教我一些关于PHP的我不知道的东西吗?

你可以试试parent::foo()

在c类中:

<?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();
?>
请参见,您可以尝试使用parent::foo()

在c类中:

<?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();
?>

好吧,我敢肯定我试过了,PHP翻了个狗屎,但我肯定会再尝试一次。谢谢这次成功了,所以我第一次肯定是做错了什么。好吧,我很确定我试过了,然后PHP翻了个狗屎,但我会再试试的。谢谢这次成功了,所以我第一次肯定是做错了什么。