PHPでのオブジェクトのコピーとクローン作成

无忌哥哥
リリース: 2023-04-01 21:20:02
オリジナル
2449 人が閲覧しました

# オブジェクトのコピーと複製

# * 1. デフォルトでは、オブジェクトは参照によって渡されます (実際にはオブジェクト識別子のコピー。これについては後ほど詳しく説明します)

# * 2. つまり、2 つのオブジェクト変数は実際には同じオブジェクトを参照します

#* * 3. 新しいオブジェクトを作成する場合は、clone キーワードを使用して現在のオブジェクトのクローンを作成する必要があります

* 4 . clone キーワードを使用する場合、クラス内に __clone() があれば、自動的に呼び出されます

# * 5. __clone() メソッドは、新しく作成されたオブジェクト上で実行されます

* 6.__clone() メソッドは、コピーする内容とクローン作成時に完了する基本操作を制御できます。

class Member
{
    //声明三个私有属性
    private $name;  //会员名
    private $email; //会员邮箱
    private $score; //会员积分
    
    //构造方法
    public function __construct($name='',$email='',$score=0)
    {
        $this->name = $name;
        $this->email = $email;
        $this->score = $score;
    }
    
    //查询器(暂时省略访问控制)
    public function __get($name)
    {
        return $this->$name;
    }
    
    //设置器(暂时省略访问控制)
    public function __set($name,$value)
    {
        $this->$name = $value;
    }
    
    //克隆魔术方法在对象克隆时自动调用,针对新对象进行初始化操作
    public function __clone()
    {
        $this->score = 0;
    }
    
}
ログイン後にコピー

//メンバー クラス Member をインスタンス化し、メンバー オブジェクト $member

$member = new Member('peter','peter@php.cn',1000);
ログイン後にコピー

を作成します。 //アクセステスト

echo $member->score;
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

//メンバーオブジェクトをコピーします

$member1 = $member;
ログイン後にコピー

//新しい変数名$member1を使用してオブジェクト情報を更新します

$member1->score = 2000;
ログイン後にコピー

//新しい変数名を使用しますオブジェクト変数名 $member1 にアクセス

echo $member1->score;
echo &#39;<hr>&#39;;
ログイン後にコピー

//元のオブジェクト名 $member を使用して

echo $member->score;
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

にアクセス * 結論:

* 1. 新しい変数の結果変更は元のオブジェクト変数

* 2 に反映されます。これら 2 つの変数が実際に同じオブジェクトを指していることを説明します

* 3。つまり、オブジェクトはデフォルトで参照によって渡されます

* 4. つまり、2番目の変数名 $member1 は、元の変数のエイリアスに過ぎず、新しいオブジェクトは作成されません。

# * 5. 単にであることが理解できます。元のオブジェクトの識別子の新しい名前

var_dump($member1);  //对象id=1
var_dump($member);   //对象id=1
ログイン後にコピー

//説明$ member1 と $member は名前が異なるだけで、2 つの同一のオブジェクトです

//次の場合はどうすればよいですか新しいオブジェクトを完全に作成するには、次のキーワードを使用する必要があります: clone

$member2 = clone $member;
ログイン後にコピー

//まずオブジェクト変数のスコア属性値を確認しましょう $member2

echo $member2->score; //目前是原始值2000
ログイン後にコピー

//スコア値を変更します

$member2->score = 5000;
echo &#39;<hr>&#39;;
ログイン後にコピー

//$member2 のスコアをもう一度確認してください

echo $member2->score; //新值5000
echo &#39;<hr>&#39;;
ログイン後にコピー

//よく考えてください、私の変更は元の $member 変数のスコア属性値に影響を与えるでしょうか?

echo $member->score; //发现原对象的score属性值仍为2000,未发生变化
ログイン後にコピー

//これはなぜですか? クローン技術を使用して 2 つのまったく異なるオブジェクト変数を作成したためです。

//以下の検証

var_dump($member); //变量id是1
var_dump($member2); //变量id是2
ログイン後にコピー

//これら 2 つのオブジェクト変数の ID が異なることを示しています。これらは 2 つの完全に異なるオブジェクトです

//次のタスクを実行します: 新しいメンバー オブジェクトを作成するとき、メンバーのポイントをゼロにクリアします。

#//作成する必要がありますか? Member クラス Magic メソッドの __clone() クローン。クローンされた新しいオブジェクトを前処理します。

//もう一度デモンストレーションします

//現在のポイントを表示します

echo $member->score;
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

//Clone新しいオブジェクトを作成します $member3

$member3 = clone $member;
ログイン後にコピー

//新しいオブジェクト $member3 のスコア値をチェックして、クラス内の __clone() が有効かどうかを確認します?

echo &#39;<hr>&#39;;
echo $member3->score; //0,说明克隆魔术方法已经生效
ログイン後にコピー

以上がPHPでのオブジェクトのコピーとクローン作成の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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