3

これは基礎知識かもしれませんが、自分でもまだ知らないので気になります。クラスを使用するときにPHP(および確かに他の言語)で、子クラスがコンストラクトメソッドを使用して親クラスのプロパティにアクセスする必要があるのはなぜですか。これが不明な場合は、例を含めます。

    <?php
     class aClass
      {
       protected $aProperty = "Some value";
      }
     class aDifferentClass extends aClass
      {
       public $aDifferentProperty;
       public function __construct()
        {
         $this->$aDifferentProperty = $this->aProperty;
      }
    ?>//Works.

それ以外の:

    <?php
     class aClass
      {
       protected $aProperty = "Some value";
      }
     class aDifferentClass extends aClass
      {
       public $aDifferentProperty = $this->$aProperty;
      }
    ?>//Doesn't work.
4

2 に答える 2

1

コンストラクターが必要であるという問題ではなく、いつアクセスしようとしているかの問題です。クラスはオブジェクトの青写真です-上記の例で行ったように、プロパティを割り当てようとしているとき、つまり.

public $aDifferentProperty = $this->aProperty;

オブジェクトがないので、「これ」はまだ存在しません。しかし、代わりに、これは機能します:

class A {
  protected $a_property = "BOOYEA!";
}

class B extends A {
   public function show_me_a_prop() {
      echo $this->a_property;
   }
}

$object = new B();
$object->show_me_a_prop();

したがって、あなたの質問に答えるには、オブジェクトが構築されるまでプロパティにアクセスするまで待つ必要があります。構築されるまではオブジェクトではなく、オブジェクトの青写真に過ぎないからです。

ここで、これをもう少し詳しく説明すると、変数をプロパティに直接割り当てることはできませんでしたが ( http://php.net/manual/en/language.oop5.properties.phpを参照)、定数を割り当てることはできます。したがって、これは機能する同様の例です。

class A {
  const a_property = "BOOYEA!";
}

class B extends A {
   public $b_property = self::a_property;
}

$object = new B();
echo $object->b_property;
于 2013-06-15T05:25:53.583 に答える
0

「__construct」は PHP5 で導入され、コンストラクターを定義する正しい方法です (PHP4 では、コンストラクターにクラスの名前を使用していました)。

クラスでコンストラクターを定義する必要はありませんが、オブジェクトの構築にパラメーターを渡したい場合は、コンストラクターが必要です。

また...子クラスが継承するクラスを変更する場合、親へのコンストラクト呼び出しを変更する必要はありません。

クラス間で再利用可能で、親を簡単に変更できるため、 のparent::__construct()代わりに呼び出す方がはるかに簡単です。parent::ClassName()

于 2013-06-15T03:41:40.800 に答える