如果我有这样的抽象类:
abstract class MyApp
{
public function init()
{
$this->stuff = $this->getStuff();
}
public function getStuff()
{
return new BlueStuff();
}
}
然后我有一个从这个抽象类扩展的类:
class MyExtendedClass extends MyApp
{
public function init()
{
parent::init();
}
public function getStuff()
{
return new RedStuff();
}
}
如果我这样做:
$myobj = new MyExtendedClass();
$myobj->init();
为什么要调用子类中的方法getStuff?在抽象类的上下文中不是$ this吗?如果是这样,不应该调用抽象类的方法吗?
谢谢!
答案 0 :(得分:3)
在PHP中,您可以使用子类,就好像子类中不存在的子类中的所有方法都已复制到子类中一样。所以你的例子就是:
class MyExtendedClass extends MyApp {
public function init() {
$this->stuff = $this->getStuff();
}
public function getStuff() {
return new RedStuff();
}
}
只要将子类视为拥有父类的所有代码,您通常都可以。此规则有一个例外:属性。类的private
属性只能由该类访问,子类不能访问父类的private
属性。为此,您需要将private
属性更改为protected
属性。
Abstract classes就像常规类一样,有一个很大的区别:它们无法启动。这意味着您无法执行new AbstractClass();
。
由于它们与其他所有内容的常规类完全相同,因此extending classes也是如此。这意味着PHP首先尝试在启动的类中查找方法,并且只在抽象类中查找它(如果它不存在)。
因此,在您的示例中,这意味着将调用getStuff()
中的MyExtendedClass
方法。此外,这意味着您可以省略init()
中的MyExtendedClass
方法。