ホームページ >バックエンド開発 >PHPチュートリアル >PHP オブジェクト指向 - オブジェクトのクローン作成 clone とマジックメソッド __clone() の詳細説明
PHP4 のオブジェクト指向 関数の大きな欠点は、オブジェクトを別の データ型 として扱うため、デザイン パターン などの多くの一般的な OOP メソッドが使用できなくなることです。これらのメソッドは、オブジェクトを値としてではなく、参照として他のクラス メソッドに渡すことに依存しています。これは、PHP のデフォルトの方法です。幸いなことに、PHP5 ではこの問題が解決され、デフォルトですべてのオブジェクトが参照として扱われるようになりました。ただし、すべてのオブジェクトは値ではなく参照として扱われるため、オブジェクトをコピーすることがより困難になります。参照されたオブジェクトをコピーしようとすると、これは元のオブジェクトのアドレスのみを指します。コピーの問題を解決するために、PHP はクローン (メソッドではなくキーワード) オブジェクトを複製する明示的な方法を提供します。
次のように、オブジェクトの前に clone キーワードを追加してオブジェクトを複製できます:destinationObject = clone targetObject;Clone object:
<?phpclass Person{ var $name; var $sex; var $age; function construct($name, $sex, $age){ $this->name = $name; $this->sex = $sex; $this->age = $age; } function say(){ echo "我的名字:" . $this->name . ",性别:" . $this->sex . ",年龄:" .$this->age . "<br />"; } }$person1 = new Person("张三三", "男", 23); $person2 = clone $person1; //使用clone关键字克隆/复制对象,创建一个对象的副本 $person3 = $person1; //这不是复制对象,而是为对象多复制出一个访问该对象的引用 $person1->say(); //调用原对象中的说话方式,打印原对象中的全部属性值 $person2->say(); //调用副本对象中的说话方式,打印克隆对象中的全部属性值 $person3->say(); //调用原对象中的说话方式,打印原对象中的全部属性值?>
<?phpclass Person{ var $name; var $sex; var $age; function construct($name, $sex, $age){ $this->name = $name; $this->sex = $sex; $this->age = $age; } function say(){ echo "我的名字:" . $this->name . ",性别:" . $this->sex . ",年龄:" .$this->age . "<br />"; } function clone(){ $this->name = "李四四"; //为副本对象中的name属性重新赋值 $this->age = 10; //为副本对象中的age属性重新赋值 } }$person1 = new Person("张三三", "男", 23); $person2 = clone $person1; //创建一个对象的副本,并自动调用类中的clone()方法 $person1->say(); //调用原对象中的说话方式,打印原对象中的全部属性值 $person2->say(); //调用副本对象中的说话方式,打印克隆对象中的全部属性值?>実行結果:
我的名字:张三三,性别:男,年龄:23 我的名字:李四四,性别:男,年龄:10
operator」を使用すると、現在のオブジェクトがコピーされ、同じ新しいオブジェクトが生成され、クラスのマジックメソッド clone() がこの時点で自動的に呼び出されます (このメソッドがクラスに存在する限り)。 シングルトンクラスを実装したい場合は、このシングルトンクラスのオブジェクトの
「クローン作成を無効にする」必要があります。 PHP では、シングルトン クラス オブジェクトのクローン作成によって上記のシングルトン クラスの実装形式が壊れることを防ぐために、通常、空の private (プライベート修正) clone() メソッドが提供されます。
まず、
「クローンを禁止しない」の効果を見てみましょう:
<?php class SingetonBasic { private static $instance; //静态变量要私有化,防止类外修改 private function construct() { //构造函数私有化,类外不能直接新建对象} // private function clone() {} //在clone()前用private修饰,用来禁止克隆 public static function getInstance() { //公共的静态方法, public——外部的接口,static——不使用对象而是通过类名访问 if (!(self::$instance instanceof self)) { //私有静态变量$instance为空 self::$instance = new self(); //新建为自身的对象,并赋值给私有变量$instance } return self::$instance; //返回私有变量$instance} }$a = SingetonBasic::getInstance();$b = SingetonBasic::getInstance(); var_dump($a === $b); //结果为:boolean true a和b指向的是同一个对象$c = clone $a; var_dump($a === $c); //结果为:boolean false a和c指向的不是同一个对象?>実行結果は
boolean trueboolean falseです。「クローンを禁止」します。つまり、コードの
private function clone() {} //在clone()前用private修饰,用来禁止克隆行から
コメントを削除します。上記のコードでは。
実行結果はboolean trueFatal error: Call to private SingetonBasic::clone()つまり、クローン作成時に clone() が自動的に呼び出されますが、メソッドはプライベートに変更されており、クラスの外から直接呼び出すことができず、エラーになります。
以上がPHP オブジェクト指向 - オブジェクトのクローン作成 clone とマジックメソッド __clone() の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。