php clone 對象克隆

分享PHP手冊上 關於對象克隆的例子

<?php
class SubObject
{
    static $instances = 0;
    public $instance;

    public function __construct() {
        $this->instance = ++self::$instances;
    }

    public function __clone() {
        $this->instance = ++self::$instances;
    }
}

class MyCloneable
{
    public $object1;
    public $object2;

    function __clone()
    {
        // 強制複製一份this->object, 否則仍然指向同一個對象
        $this->object1 = clone $this->object1;
    }
}

$obj = new MyCloneable();    //第一步

$obj->object1 = new SubObject();    //第二步
$obj->object2 = new SubObject();

$obj2 = clone $obj;    //第三步

print_r($obj);

print_r($obj2);

第一步:

$obj = new MyCloneable();

這裏$obj是MyCloneable的對象

MyCloneable Object
(
    [object1] => 
    [object2] => 
)

第二步:

$obj->object1 = new SubObject();
$obj->object2 = new SubObject();

這裏是對MyCloneable對象進行賦值,將SubObject的對象分別賦給MyCloneable的object1,object2屬性

MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 1
        )

    [object2] => SubObject Object
        (
            [instance] => 2
        )

)

第三步:

$obj2 = clone $obj;

將MyCloneable的對象$obj克隆產生obj2,克隆完成後,

首先調用MyCloneable的__clone()方法,這個方法會再次克隆obj2的object1屬性(該屬性值是SubObject的對象)

繼而調用SubObject的__clone()方法,使得instance值加1,也就是obj2的object1屬性加1變成3。


print_r($obj);

MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 1
        )

    [object2] => SubObject Object
        (
            [instance] => 2
        )

)


print_r($obj2);

MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 3
        )

    [object2] => SubObject Object
        (
            [instance] => 2
        )

)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章