ホームページ > バックエンド開発 > PHPチュートリアル > PHP オブジェクト指向 - オブジェクトのクローン作成 clone とマジックメソッド __clone() の詳細説明

PHP オブジェクト指向 - オブジェクトのクローン作成 clone とマジックメソッド __clone() の詳細説明

黄舟
リリース: 2023-03-06 22:02:01
オリジナル
1649 人が閲覧しました

1.ObjectClone

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();   //调用原对象中的说话方式,打印原对象中的全部属性值?>
ログイン後にコピー

2.Magic Methodclone()

合計2つです。上記のプログラム オブジェクトで作成されたオブジェクトのうちの 1 つは、clone キーワードを使用して複製されたコピーです。 2 つのオブジェクトは完全に独立できますが、それらのメンバーとプロパティの値はまったく同じです。クローン作成中に、クローンされたコピー オブジェクトのメンバー プロパティに初期値を再割り当てする必要がある場合は、クラス内でマジック メソッド「clone()」を宣言できます。このメソッドはオブジェクトのクローン作成時に自動的に呼び出されるため、このメソッドを通じてクローンされたコピーを再初期化できます。 clone() メソッドにはパラメータは必要ありません。上記の例のコードを書き直し、マジック メソッド clone() をクラスに追加し、コピー オブジェクトのメンバー プロパティを再初期化します。

<?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
ログイン後にコピー

3. シングルトンクラスの強化: クローン作成の禁止

クラスのオブジェクトに対して、完全に同一のオブジェクトである「clone

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート