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();
    }
}

サブクラスは親クラスのすべてのコードを持っていると考えてください。通常は問題ありません。この規則には1つの例外があります。それは、プロパティです。クラスのprivateプロパティにはそのクラスのみがアクセスでき、サブクラスprivateは親クラスのプロパティにアクセスできません。privateそのためには、プロパティをプロパティに変更する必要がありprotectedます。


元の回答

PHPの抽象クラスは、通常のクラスと同じですが、大きな違いが1つあります。それは、開始できないことです。これはあなたができないことを意味しますnew AbstractClass();

それらは他のすべての通常のクラスとまったく同じように機能するため、これはクラスを拡張する場合にも当てはまります。これは、PHPが最初に開始されたクラスでメソッドを見つけようとし、抽象クラスが存在しない場合にのみそれを調べることを意味します。

したがって、あなたの例では、これはgetStuff()からのメソッドMyExtendedClassが呼び出されることを意味します。init()さらに、これは、のメソッドを省略できることを意味しますMyExtendedClass

于 2012-11-18T18:56:28.567 に答える