1

如果我有这样的抽象类:

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

谢谢!

4

1 回答 1

3

新答案

在 PHP 中,您可以使用子类,就好像父类中不存在于子类中的所有方法都已复制到子类中一样。因此,您的示例将与以下内容相同:

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

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

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


原始答案

PHP 中的抽象类与普通类一样,但有一个很大的不同:它们不能被启动。这意味着你不能这样做new AbstractClass();

由于它们与其他所有内容的常规类完全一样,因此扩展类也是如此。这意味着 PHP 首先尝试在启动的类中查找方法,如果抽象类不存在,则仅在抽象类中查找。

所以在你的例子中,这意味着getStuff()方法 fromMyExtendedClass被调用。此外,这意味着您可以省略init().MyExtendedClass

于 2012-11-18T18:56:28.567 回答