私は事故によってこれを発見し、これは予期される動作であればと思いまして:既存のオブジェクトからインスタンス化することは可能ですか?
Interactive shell
php > class dog {
php { public $name='doggy';
php { public function speak() {
php { echo "bark, bark! (my name is " . $this->name . ")\n";
php { }
php { }
php >
php > $puppy = new dog;
php > $puppy->speak();
bark, bark! (my name is doggy)
php >
php > $taffy = new $puppy;
php > $taffy->speak();
bark, bark! (my name is doggy)
php >
php > $taffy->name = "Taffy";
php > $taffy->speak();
bark, bark! (my name is Taffy)
php >
php > $puppy->speak();
bark, bark! (my name is doggy)
php >
私の質問は、ライン、$taffy = new $puppy;
通常約、私は$taffy = new dog;
をコード化しているだろうされて、私は「wouldnインスタンス化からインスタンス化することによって新しいオブジェクトを作成できると期待しています...もしそれが意味をなさないならば。
この機能は期待されていますか?
いくつかの異なるDBテーブルに話をするために必要なモデルを構築するとき、私はこれを発見し、私は、データベースの抽象化を渡すために、依存性注入を使用します。
class ShowConnectedTables {
public function __constructor($db) {
$this->modelOne = new ModelOne($db);
$this->modelTwo = new ModelTwo($db);
}
// ... snip ...
}
$table = new ShowConnectedTables(new Database);
しかし場合によっては、へのデータベース呼び出しをModelOneの行をフェッチするループの途中にあるModelTwoは、ModelOneの行のフェッチを壊す可能性があります。だからそれは許容可能です
class ShowConnectedTables {
public function __constructor($db) {
$this->modelOne = new ModelOne($db);
$this->modelTwo = new ModelTwo(new $db); // note new abstraction
}
// ... snip ...
}
$table = new ShowConnectedTables(new Database);
それは確かに 'clone'を使用するのがより一般的です - 私はそれが状態をしたいのではなく、既存のものに基づいて新しいオブジェクトを作成することが特に一般的な状況だとは思わないコピーに代理すること。私はこれもうまくいきませんでした(そして、PHP 5が最初に出て以来のことです)。何かを教えてくれてありがとう。 – iainn
ここを参照してください:http://php.net/manual/language.oop5.basic.php#example-218明らかに、この動作は非従来的ではありません。この例では、@MarkBakerは間違っているように見えます。 – Kaddath
@ MarkBaker私はそれが '$ newObj = * new * $ existingObj'ではなく' $ newObj = $ existingObj'を実行することを指していると思います。 – iainn