2

有很多子类调用重写父方法的示例,最常见的是parent::__construct(). 然而,在这些情况下,您实际上是从子进程本身的具体方法调用父进程。

有没有一种方法可以使用继承的方法递归地从孩子调用一个方法到第一个祖先?

如果我parent::methodName()在我的抽象父类中使用它会导致一个致命错误说“当当前类范围没有父级时无法访问父级::”。大概这是因为“父”是相对于抽象类本身而不是当前类上下文进行评估的。

谢谢...

4

2 回答 2

1

我不太确定您要做什么,但是:

  1. parent关键字是相对于它出现的类进行评估的。如果你使用关键字的类没有parent父类,它显然不起作用。
  2. 如果您希望孩子使用父母的方法,只需不要在孩子中覆盖该方法。在父级中定义一个强制子级调用父级方法的方法是没有意义的,而您需要做的只是不覆盖子级中的方法。
  3. 您可以通过设置方法来强制父方法成为“最后一句话” final,孩子将无法覆盖它。
  4. 一个孩子不能调用“祖父母”的方法,因为孩子不知道,或者至少不能保证,它的父母依次有一个父母。

实际上,这意味着:

  1. 如果您正在编写一个没有extend另一个类的类,那么在其中的任何地方使用都是没有意义的parent
  2. 如果您正在extend创建一个类并且没有覆盖方法,则将自动使用父方法(它是继承的)。
  3. 如果您正在extend编写一个类并覆盖一个方法,您可以parent从该覆盖的方法调用 ' 方法,而后者又可以调用其parent' 方法等。
于 2012-05-21T02:20:40.500 回答
0

也许是这样的?(未经测试)

foreach (get_class_parents($this) as $className) {
    (new ReflectionMethod($className, __METHOD__))->invoke($this, $args...);
}

当我在代码中看到这种垃圾时,我讨厌。

于 2012-05-21T02:45:21.067 回答