2013-06-05 398 views
1

如何从子实例中递归地调用覆盖父函数?由于我没有使用静态方法,我不能使用parent::method(),但必须做某种不同的事情。我有一种感觉,我的问题有更好的方法,可能是通过设计模式。这是我的阶级结构:在php中调用覆盖父函数的子函数

class Creature { 
    public function eat() { 
     // feed and digest 
    } 
} 

class Mammal extends Creature { 
    public function eat() { 
     // gather and chew 
    } 
} 

class Human extends Mammal { 
    public function eat() { 
     // have a meal 
    } 
} 

class WesternPerson extends Human { 
    public function eat() { 
     // use knife & fork 
    } 
} 

$me = new WesternPerson(); 
$me->eat(); 

调用eat()应从特殊递归去向上到非常抽象类。最简单的方法是,如果我可以在被覆盖的函数中调用具有相同名称的父函数。但我知道,它被覆盖,所以我不能。

+2

' parent :: method()'不是一个静态调用(虽然它看起来像它)。只要使用那个就可以了。 – Wrikken

+1

另请参阅:http://stackoverflow.com/a/16925581/2153758 – bwoebi

+0

非常感谢!由于'::'运算符,我显然感到困惑。我现在很清楚。 – quape

回答

4

::不只是静态方法。它是范围解析运算符。它在任何时候都可以用来使用除了你的上下文范围之外的范围内存在的函数。

parent,staticself是引用与您的调用范围相关的不同范围的语言结构。

在这种情况下

parent::eat() 

将调用人力::

因此,吃在WesternPerson ::吃的上下文(即$这将意味着WesternPerson例如在人类吃::上下文)

2

正如评论指出,呼吁parent::eat()会工作得很好