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;
}
}
意味がありますか?
ありがとう!マットミューラー
子でparent :: __constructを呼び出すだけです。
class Form extends Tag
{
function __construct()
{
parent::__construct();
// Called second.
}
}
はい。ただし、内部的にのみ(つまり、PHP拡張子)を記述することにより)、私があなたである場合は、parent::__construct()
を呼び出すことにします。 このセクション PHP wiki。
申し訳ありませんが、PHPはJavaではありません。(暗黙的または明示的に)スーパーコンストラクターを呼び出す必要がないことは、設計上の決定としては非常に貧弱でした。
ええ、コンストラクトでparent::__construct()
を呼び出すだけです
その音から、コンストラクターでパラメーターを渡す必要がないように、設計を再考することをお勧めします。それができないと思うなら、質問としてそれを尋ねてください、あなたはいくつかの提案に驚かれるかもしれません。
子クラスには、親コンストラクターをまったく呼び出さずにオーバーライドする機能があります。親クラスにfinalメソッドを含めることをお勧めします。そうすれば、これがオーバーライドされたくないことを誰もが知っており、継承されたクラスは(当然のことながら)コンストラクターで必要なことを実行するためのアクセス権を持っています。
class Father {
private $_privateData;
final function setPrivateData($privateData) {
$this->_privateData = $privateData;
}
}
もう1つの、推奨されない、より「車輪の再発明」の解決策は、親クラスで関数を定義することです。たとえば、_construct()は、独自の構造で呼び出されます。それは本当に明確ではなく、言語の機能/構造を使用せず、単一のアプリケーションに非常に固有です。
最後に覚えておくべきことは、子クラスから情報を実際に隠すことはできないということです。 Reflection、serialize、var_dump、var_export、およびphp言語の他のすべての便利なAPIを使用すると、データに対して何も実行しないコードがある場合、データを保存しない以外にできることはほとんどありません。サンドボックスの作成に役立つライブラリなどがありますが、それ自体からオブジェクトをサンドボックス化するのは困難です。
編集:どういうわけか私はArtefactoの答えを逃しました、そして私は彼が正しいと思います(私はそれをするための拡張機能を書いてみたことがありません)。それでも、それを実装すると、開発者の期待が裏切られ、何が起こっているのかを説明するコードを実際に見ることが難しくなります。