创建对象的克隆,但是继承原始对象的 class
Creating a clone of an object, but of a class that inherits the original one
在给定的场景中,我有一个 class:
class shopCart {}
我在那里使用 析构函数 和 构造函数 来执行某些操作。
稍后,我想存储购物车的序列化版本。但是,我序列化的对象应该 not 包含 destructor 和 constructor 方法。
为了实现这一点,我创建了一个 class:
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
,但令我惊讶的是,我仍然得到一个引用.没看懂。
是否可能,克隆对象中的对象仍然是对原始对象的引用?
您想要的技术称为制作 "deep clone",可以使用对象中的 __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;
}
}
}
只需在您的主 class 中定义它,然后在您作为属性存储在该 class 中的所有对象的 classes 中,一直向下 [=12] =]
当然,如果您将对象数组保存为 属性,您还需要调整此代码以遍历该数组
在给定的场景中,我有一个 class:
class shopCart {}
我在那里使用 析构函数 和 构造函数 来执行某些操作。
稍后,我想存储购物车的序列化版本。但是,我序列化的对象应该 not 包含 destructor 和 constructor 方法。
为了实现这一点,我创建了一个 class:
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
,但令我惊讶的是,我仍然得到一个引用.没看懂。
是否可能,克隆对象中的对象仍然是对原始对象的引用?
您想要的技术称为制作 "deep clone",可以使用对象中的 __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;
}
}
}
只需在您的主 class 中定义它,然后在您作为属性存储在该 class 中的所有对象的 classes 中,一直向下 [=12] =]
当然,如果您将对象数组保存为 属性,您还需要调整此代码以遍历该数组