__clone()方法和传址区别

示例:

<?php
    class Computer{
        public $name = '联想';
        public function _run(){
            return '运行中';
        }
    }
    $comp1 = new Computer();
    $comp2 = new Computer();
    $comp_1 = $comp1;
    $comp_2 = clone $comp2;
?>

在上边示例中我们首先要理解:

1 new Computer();创建了两个对象,分别保存在堆内存中不同区域,然后分别把两个对象的地址赋值给$comp1和$comp2(保存在栈内存中),所以呢两者中谁改变都不会影响对方

2 $comp_1 = $comp1,由于$comp1是地址,所以是把地址赋值给了$comp_1,两者都是指向的同一个堆内存区域,两者其实是一个东西,只不过名字不同,殊途同归

3 $comp_2 = clone $comp2 是克隆,字面意思,就是复制,把$comp2指向的堆内存复制一份,$_comp_2指向的就是复制的那块堆内存

另外:在类中定义__clone()方法可以改变复制的默认行为,就是自己定义复制(自己定义的复制不一定是完全一样的再来一份,定义复制是翻倍还是其他什么都可以的)

     执行复制时会自动调用__clone()函数

<?php
    class Computer{
        public $name = '联想';
        public function __clone(){
            $this->name = 'dell';
        }
    }
    $com1 = new Computer();
    $com2 = clone $com1;
    echo $com2->name;  //dell
?>

 

posted @ 2016-12-26 11:15  党兴明  阅读(142)  评论(0编辑  收藏  举报