web-dev-qa-db-ja.com

PHP)で子コンストラクターの前に親コンストラクターを呼び出します

PHPで継承された子の__construct()の前に、親を__construct()と呼ぶことが可能かどうか疑問に思いました。

例:

class Tag {
     __construct() {
         // Called first.
     }
}

class Form extends Tag {
     __construct() {
         // Called second.
     }
} 

new Form();

理想的には、私はそれらの間に何かをすることができるでしょう。これが不可能な場合、これを可能にする代替手段はありますか?

これを実行したい理由は、__ construct()が呼び出されたときにFormが使用できるタグに固有の一連のデフォルト設定をロードできるようにするためです。

編集:これを追加するのを忘れて申し訳ありません。子クラスから親クラスを呼び出さないでください。これは、子として渡すと、(親の)プライベートデータが子に公開されるためです。引数

これが私がやりたいことです:

$tag = new Tag($privateInfo, $publicInfo);
$tag->extend(new Form()); // Ideal function, prob doesn't work with inheritance.

Tag.php

class Tag {
     private $privateInfo;
     public $publicInfo;
     __construct($private, $public) {
         $this->privateInfo = $private;
         $this->publicInfo = $public;
     }
} 

Form.php

class Form extends Tag {

     __construct() {
         echo $this->publicInfo;
     }
} 

意味がありますか?

ありがとう!マットミューラー

29
Matt

子でparent :: __constructを呼び出すだけです。

class Form extends Tag
{
    function __construct()
    {
        parent::__construct();
        // Called second.
    }
}
46

はい。ただし、内部的にのみ(つまり、PHP拡張子)を記述することにより)、私があなたである場合は、parent::__construct()を呼び出すことにします。 このセクション PHP wiki。

申し訳ありませんが、PHPはJavaではありません。(暗黙的または明示的に)スーパーコンストラクターを呼び出す必要がないことは、設計上の決定としては非常に貧弱でした。

3
Artefacto

ええ、コンストラクトでparent::__construct()を呼び出すだけです

3
Pentium10

その音から、コンストラクターでパラメーターを渡す必要がないように、設計を再考することをお勧めします。それができないと思うなら、質問としてそれを尋ねてください、あなたはいくつかの提案に驚かれるかもしれません。

子クラスには、親コンストラクターをまったく呼び出さずにオーバーライドする機能があります。親クラスにfinalメソッドを含めることをお勧めします。そうすれば、これがオーバーライドされたくないことを誰もが知っており、継承されたクラスは(当然のことながら)コンストラクターで必要なことを実行するためのアクセス権を持っています。

class Father {
    private $_privateData;
    final function setPrivateData($privateData) {
        $this->_privateData = $privateData;
    }
}

もう1つの、推奨されない、より「車輪の再発明」の解決策は、親クラスで関数を定義することです。たとえば、_construct()は、独自の構造で呼び出されます。それは本当に明確ではなく、言語の機能/構造を使用せず、単一のアプリケーションに非常に固有です。

最後に覚えておくべきことは、子クラスから情報を実際に隠すことはできないということです。 Reflection、serialize、var_dump、var_export、およびphp言語の他のすべての便利なAPIを使用すると、データに対して何も実行しないコードがある場合、データを保存しない以外にできることはほとんどありません。サンドボックスの作成に役立つライブラリなどがありますが、それ自体からオブジェクトをサンドボックス化するのは困難です。

編集:どういうわけか私はArtefactoの答えを逃しました、そして私は彼が正しいと思います(私はそれをするための拡張機能を書いてみたことがありません)。それでも、それを実装すると、開発者の期待が裏切られ、何が起こっているのかを説明するコードを実際に見ることが難しくなります。

1
Reece45