创建对象的克隆,但是继承原始对象的类

时间:2015-07-02 19:44:49

标签: php class oop inheritance instance

在给定的场景中,我有一个班级:

class shopCart {}

我在那里使用析构函数构造函数来执行某些操作。

稍后,我想存储购物车的序列化版本。但是,我序列化的对象应合并析构函数构造函数方法。

为了实现这一目标,我创建了一个类:

class storageCart extends shopCart {
    function __construct(){}
    function __destruct(){}
}

现在,在我存储购物车之前,我必须创建一个storageCart类型的新对象,并确保它包含shopCart的所有属性。

为了满足这一需求,shopCart有一个方法getInstanceForStorage()

public function getInstanceForStorage() {
    $storageCart = new storageCart();
    foreach(get_object_vars($this) as $k => $v){
        $storageCart->{$k}=$v;
    }
    return $storageCart;
}

问题是我对新实例(storageCart)所做的更改似乎会影响原始实例(shopCart)。

值得一提的是,shopCart的一个变量是包含对象(购物车项目)的数组。

我认为我遇到了一些对象/实例化/复制/克隆(或缺少)混乱。但我不知道问题是什么,因为我在上面的foreach循环中没有使用指针。

任何人都可以了解这里发生的事情吗?

注意:这是PHP> 5.3

修改

我尝试通过将对象分配给新对象中的同一个数组并使用clone来复制包含对象的数组的内容,但是 - 令我惊讶的是 - 我仍然最终得到了一个引用。我不明白。

是否可能,克隆对象中的对象仍然是对原始对象的引用?

1 个答案:

答案 0 :(得分:1)

您想要的技术称为制作深度克隆",并且可以使用对象中的__clone()魔术方法轻松实现:

/**
 * Implement PHP __clone to create a deep clone, not just a shallow copy.
 */
public function __clone()
{
    foreach ($this as $key => $val) {
        if (is_object($val) || (is_array($val))) {
            $this->{$key} = clone $val;
        }
    }
}

只需在您的主类中定义它,并在您存储为该类属性的所有对象的类中,一直向下

当然,如果您将一个对象数组作为属性,那么您还需要调整此代码来遍历该数组