1

N番目(2番目または3番目またはAny)のサブクラスからスーパー親クラスのコンストラクターを呼び出す方法を知りたいです。

class a{
    public function __construct(){
        echo "<br>In constructor of class A <br>";
    }
}
class b extends a {
    public function __construct(){
        echo "<br>In constructor of class B <br>";
    }
}
class c extends b {
    public function __construct(){
        parent::__construct();
        echo "<br>In constructor of class C <br>";
    }       
}
$obj = new c;

親のコンストラクターが呼び出されている上記のクラスCのコンストラクターで行う必要のある変更。親::__construct(); クラスBのコンストラクターを指します。クラスCからクラスAのコンストラクターを呼び出す必要があります。

4

4 に答える 4

6

のような機能が提供されていないため、参照を使用してclass aのコンストラクターを呼び出す方法はありません。class cparentparent::parent::etc


別の注意点:あなたがしていることは、継承の目的を打ち負かします。クラスcは、それがベースであるという事実が実際にクラスaを継承していることを認識してはなりません。

クラスbがクラスaのコンストラクターを実行したい場合は、これを実装する必要があります。これにより、クラスcがクラスaのコンストラクターを呼び出したい場合は、クラスbではなくクラスaから継承する必要があります。


ねえ、私は端に住みたい-私ができないことを私に言うのをやめなさい!! one

さて、本当にこれを回避したい場合は、以下を使用してクラスaのコンストラクターを明示的に呼び出すことができます。

class c extends b { 
  public function __construct(){
    a::__construct ();
  }    
}
于 2012-07-17T08:04:32.490 に答える
2

a::__construct()内から直接電話をかけることもできますc::__constructが、これは悪い考えです。

それをしません!

それを行う必要があると感じているという事実は、このクラス階層に深刻な根本的な問題がある可能性が高いことを示しています。ifcのコンストラクターを継承することを意図していたのはなぜですか?bb

于 2012-07-17T07:58:37.733 に答える
0

次のような子クラスでは、常に親のコンストラクターを呼び出す必要があります。

class a{
    public function __construct(){
        echo "<br>In constructor of class A <br>";
    }
}
class b extends a {
    public function __construct(){
        parent::__construct();
        echo "<br>In constructor of class B <br>";
    }
}
class c extends b {
    public function __construct(){
        parent::__construct();
        echo "<br>In constructor of class C <br>";
    }       
}
$obj = new c;

これが、OOPの原則を実装する方法です。どういうわけか、親のコンストラクターを呼び出さないクラスが必要な場合、このクラスは、ツリー内の子ではなく、別の階層の新しい基本クラスである必要があります。コンストラクターの詳細:http ://www.php.net/manual/en/language.oop5.decon.php

于 2012-07-17T08:18:30.110 に答える
0

他の人に同意することに加えて、これは一般的に悪い習慣であるということですが、これを行うにはもう1つの方法があります。リフレクションを使用して、親の親のクラス名を取得できます。

$reflection = new \ReflectionClass($this);
$grandParent = $reflection->getParentClass()->getParentClass()->getName();
$grandParent::__construct();
于 2013-07-28T01:02:14.580 に答える