PHP对象赋值与克隆

2021-02-25 09:09:00 1726 5 编辑:深正互联 来源:互联网

在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() 方法只会在对象被克隆的时候自动调用。用意在克隆后改变原对象的内容

深正互联


本站文章均为深正网站建设摘自权威资料,书籍,或网络原创文章,如有版权纠纷或者违规问题,请即刻联系我们删除,我们欢迎您分享,引用和转载,但谢绝直接搬砖和抄袭!感谢...
关注深正互联

15

技术从业经验

多一份方案,会有收获...

联系深正互联,免费获得专属《策划方案》及报价

在线咨询
微信交谈
拒绝骚扰,我们只想为给您带来一些惊喜...
多一份免费策划方案,总有益处。

请直接添加技术总监微信联系咨询

深正互联微信
扫描即可沟通