Search

与我们合作

我们专注:网站策划设计、网络多媒体传播、网站优化及网站营销、品牌策略与设计
主营业务:网站建设、移动端微信小程序开发、VI设计、网络运营、云产品·运维解决方案

有一个品牌项目想和我们谈谈吗?

您可以填写右边的表格,让我们了解您的项目需求,这是一个良好的开始,我们将会尽快与您取得联系。当然也欢迎您给我们写信或是打电话,让我们听到您的声音

您也可通过下列途径与我们取得联系:

地 址: 深圳.龙岗区大运软件小镇11栋3楼

电 话: 138 2888 4598 / 138 0880 9053

网 址: http://www.appvx.cn

快速提交您的需求 ↓

PHP对象赋值与克隆

时间:2021-02-25 浏览:2314 编辑:深正互联 来源:互联网

在php5 的对象编程经常提到“默认情况下对象是通过引用传递的”。

普通的赋值操作只是传递了索引,只有在清除传值对象的时候,才会发生写时复制

``` 

//示例


$obj = new StdClass;

$obj->name = 'Pig';

dump($obj);                     


$copy = $obj;                      // $obj ,$copy都是new StdClass返回的同一个标识符的拷贝

dump($copy);                      //{ ["name"]=>string(3) "Pig" }


$objRef = &$obj;                   // 此时会将$obj转换成引用,然后赋值给$objRef,因此$obj,$objRef都为引用                

dump($objRef);                          // { ["name"]=>string(3) "Pig" }


$objClone = clone $obj;             //新空间

$obj->name = 'After Clone';

dump($objClone); //{ ["name"]=> "Pig" }

dump($obj);  //{ ["name"]=>"After Clone" }


//unset是删除引用效果

$nameRef = &$obj->name;   //$obj->name被转换成引用(& string),然后赋给$nameRef

dump($obj); //{ ["name"]=>&string(11) "After Clone" }

unset($nameRef);  //删除引用

dump($obj); // { ["name"]=>string(11) "After Clone" }


//null是赋值效果        

$nameRef = &$obj->name;//恢复name的引用

dump($obj); // { ["name"]=>&string(11) "After Clone" }

$nameRef = null;                

dump($obj);  //{ ["name"]=>&NULL }


unset($objRef); //仅删除引用

dump($obj);//{ ["name"]=>&NULL }


$objRef = &$obj; //恢复对象引用

$obj->name = 'Lucy';

$obj = null;    //赋值$obj为null,$obj只是new StdClass的标识拷贝,不会影响其内容。

                     //$objRef做为$obj的引用,会同时被赋值null

                     //等价 $objRef = null;


dump($obj,$copy,$objRef,$objClone);

// NULL,

//  { ["name"]=>&string(4) "Lucy" },

// NULL,

// { ["name"]=>string(3) "Pig" }


```


情景:在一个项目里面使用两个或多个一样的对象,如果使用 new 关键字重新创建对象,再赋值上相同的属性

优处理:PHP 提供了对象克隆功能,可以根据一个对象完全克隆出一个一模一样的对象,而且克隆以后,两个对象互不干扰。

```

//示例

class Person {

    private $name;

    private $age;


    function __construct($name, $age) {

        $this->name=$name;

        $this->age=$age;

    }


    function say() {

        echo "我的名字叫:".$this->name."<br />";

    echo "我的年龄是:".$this->age;

    }

}


$p1 = new Person("张三", 20);

$p2 = clone $p1;

$p2->say() //我的名字叫:张三

//我的年龄是:20

```


拓展 ```__clone()```

__clone() 方法只会在对象被克隆的时候自动调用。用意在克隆后改变原对象的内容

深正互联


本站文章均为深正网站建设摘自权威资料,书籍,或网络原创文章,如有版权纠纷或者违规问题,请即刻联系我们删除,我们欢迎您分享,引用和转载,但谢绝直接搬砖和抄袭!感谢...
GO 欣赏案例
查看经典案例
在线咨询
电话咨询
0755-36630177
返回顶部
在线咨询 获取报价 电话咨询
获取报价
您的称呼:

*

您的电话:

*

您的邮箱:

*

提交 重置
重要的事情,电话里聊

接通客服

不方便的时候线上咨询,在线等哦