17-5如何克隆对象–PHP实战开发教程

17-5如何克隆对象–PHP实战开发教程

糜湾嫁舵氨率柿日岛熟慷碾庆


对象的复制与克隆
1.默认情况下,对象是引用传递(实际上是对象标识符的复制,后面会详细说)
2.也就是说二个对象变量实际上是引用的是同一个对象
3.如果要创建一个新的对象,必须使用clone关键字来克隆当前对象
4.当使用clone关键字时,如果类中有__clone()会自动调用
5.__clone()方法运行在新创建的对象上面
6.__clone()方法能控制我们复制什么,以及克隆时要完成的基本操作


新建demo5.php

<?php
//声明会员类:Member
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;
    }

}
//实例化会员类
$member=new Member('mengmianren','mengmianren@123.com',1000);

echo $member->score."<hr>";
//复制会员对象
$member1=$member;
echo $member1->score."<hr>";
$member1->score=2000;
echo $member1->score."<hr>";
echo $member->score."<hr>";
var_dump($member);
echo "<hr>";
var_dump($member);

执行,可知复制的对象仍然是原来的对象,即复制对象并没有创建新的队形。

17-5如何克隆对象–PHP实战开发教程第1张

结论:
1.新变量修改的结果反映到了原对象变量中
2.说明这二个变量,实际上指向的是同一个对象
3.也就是对象默认是引用传递
4.或者说,第二个变量名$member1只是原变量的别名,并没创建新对象
5.可以理解为仅仅是将原对象的标识符,重新起了一个新名称罢了


克隆创建新对象:

<?php
//声明会员类:Member
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;
    }

}
//实例化会员类
$member=new Member('mengmianren','mengmianren@123.com',1000);
$member2= clone $member;
var_dump($member);
echo "<hr>";
var_dump($member2);
echo "<hr>";
echo $member2->score."<hr>";
$member2->score=5000;
echo $member2->score."<hr>";
echo $member->score."<hr>";

执行,通过克隆成功创建了新对象

17-5如何克隆对象–PHP实战开发教程第2张


__clone()克隆魔术方法在对象克隆时自动调用,针对新对象进行初始化操作

<?php
//声明会员类:Member
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=new Member('mengmianren','mengmianren@123.com',1000);
$member2= clone $member;
echo $member2->score."<hr>";

执行:

17-5如何克隆对象–PHP实战开发教程第3张


漂溯隋腺科痹绘弯蘑殊锤譬戚