$obj2 = new $obj1;
($ obj1と同じクラスのオブジェクトの新しいインスタンスを作成します)!== $obj2 = $obj1;
($obj2
$ obj1への参照を作成します)!== $obj2 = clone $obj1;
(これはオリジナルと同じプロパティ値を持つ新しい$ obj2を新しいオブジェクトインスタンスとして作成します)
私が上記のコメントで引用した3つの異なるケースについては、単純なクラスを作成してインスタンス化しましょうそれ:参照に似て、私たちは、単に元に新しい変数を割り当てると今、私たちは元へのポインタを設定している
class User {
public $firstname;
public $lastname;
public function __construct($firstname = 'TEST', $lastname = 'USER') {
$this->firstname = $firstname;
$this->lastname = $lastname;
}
public function getName() {
return implode(' ', [$this->firstname, $this->lastname]);
}
}
// original instance of a User
$obj1 = new User('Mark', 'Baker');
var_dump($obj1->getName()); // Mark Baker
(それはオブジェクトなので)、
// Simply set reference to our original User
$obj2 = $obj1;
var_dump($obj2->getName()); // Mark Baker
// And if we change properties of the instance, it changes for both because it's a reference
$obj2->firstname = 'David Mark';
var_dump($obj2->getName()); // David Mark Baker
var_dump($obj1->getName()); // David Mark Baker
彼らは同じオブジェクトインスタンスに
を指しているので、どちらかへの変更は、我々がclone
を使用する場合は、我々はブランドの新しいオブジェクトのインスタンスを作成しているが、すでに移入、他にも反映されます私たちは、元のプロパティを変更した場合、彼らは独自のインスタンスであるため、元の
// Clone the original object, this will create a new instance but will inherit property values of the original
$obj3 = clone $obj1;
var_dump($obj3->getName()); // David Mark Baker
// But changing properties of the clone won't affect the original in any way
$obj3->firstname = 'Mark';
var_dump($obj3->getName()); // Mark Baker
var_dump($obj1->getName()); // David Mark Baker
からプロパティ値は今、それがクローン(またはその逆)には影響しません。
ここでは、new
をクラス名ではなくインスタンスに使用している3番目のケースがあります。
// Now create a new instance of the same type of object as your original User
// If we had mandatory constructor arguments, then we'd have to provide them $obj4 = new $obj1('a', 'b');
// But because they're optional, we can get away with allowing the defaults
$obj4 = new $obj1;
var_dump($obj4->getName()); // TEST USER
我々が何であったか、クラスタイプ$obj1
知らなかった場合、(見つけるには十分に簡単だっただろうが)重要ではありません。これにより、クラス$obj1
の新しいインスタンスが作成され、プロパティ継承なしでclone
が与えられ、$obj2 = $obj1
のような参照もありません。コンストラクタをまだ呼び出すので、必須のコンストラクタ引数を渡す必要があります(getエラー)。
私が持っている疑いを明確にしてください。あなたの答えでは、「オブジェクトのインスタンス」という言葉を使用しましたが、実際には「オブジェクト自体はクラスのインスタンスです」という言葉を使用しました。そして、あなたはどのようにして/オブジェクトのインスタンス(すでにクラスのインスタンスです)を作る/言うことができますか? – user2839497
セマンティクス。 「オブジェクトのインスタンス」を「インスタンス化されたオブジェクト」に置き換えてください。 –