困惑在php中的抽象类

时间:2012-11-18 18:51:40

标签: php abstract

如果我有这样的抽象类:

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吗?如果是这样,不应该调用抽象类的方法吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

新答案

在PHP中,您可以使用子类,就好像子类中不存在的子类中的所有方法都已复制到子类中一样。所以你的例子就是:

class MyExtendedClass extends MyApp {
    public function init() {
        $this->stuff = $this->getStuff();
    }

    public function getStuff() {
        return new RedStuff();
    }
}

只要将子类视为拥有父类的所有代码,您通常都可以。此规则有一个例外:属性。类的private属性只能由该类访问,子类不能访问父类的private属性。为此,您需要将private属性更改为protected属性。


原始答案

PHP中的

Abstract classes就像常规类一样,有一个很大的区别:它们无法启动。这意味着您无法执行new AbstractClass();

由于它们与其他所有内容的常规类完全相同,因此extending classes也是如此。这意味着PHP首先尝试在启动的类中查找方法,并且只在抽象类中查找它(如果它不存在)。

因此,在您的示例中,这意味着将调用getStuff()中的MyExtendedClass方法。此外,这意味着您可以省略init()中的MyExtendedClass方法。