【发布时间】:2010-09-12 06:25:41
【问题描述】:
新类是原始对象的子类
需要兼容php4
【问题讨论】:
新类是原始对象的子类
需要兼容php4
【问题讨论】:
你可以用一些黑魔法来做到这一点,尽管我会认真地质疑为什么你首先有这个要求。这表明您的设计存在严重问题。
尽管如此:
function change_class($object, $new_class) {
preg_match('~^O:[0-9]+:"[^"]+":(.+)$~', serialize($object), $matches);
return unserialize(sprintf('O:%s:"%s":%s', strlen($new_class), $new_class, $matches[1]));
}
这受到与一般序列化相同的限制,这意味着对其他对象或资源的引用会丢失。
【讨论】:
php 对象与数组并没有太大的不同,而且由于所有 PHP 4 对象变量都是公共的,因此您可以做一些像这样的杂乱无章的事情:
function clone($object, $class)
{
$new = new $class();
foreach ($object as $key => $value)
{
$new->$key = $value;
}
return $new;
}
$mySubclassObject = clone($myObject, 'mySubclass');
它并不漂亮,而且它肯定不是我认为是好的做法,但它是可重复使用的,而且非常整洁。
【讨论】:
您可以将您的类实例化为空,然后通过任意数量的方法加载。其中一种方法可以接受父类的实例作为参数,然后从那里复制其数据
class childClass extends parentClass
{
function childClass()
{
//do nothing
}
function loadFromParentObj( $parentObj )
{
$this->a = $parentObj->a;
$this->b = $parentObj->b;
$this->c = $parentObj->c;
}
};
$myParent = new parentClass();
$myChild = new childClass();
$myChild->loadFromParentObj( $myParent );
【讨论】:
【讨论】:
我想您将不得不发明某种“复制构造函数”。然后,您只需在传入原始对象的同时创建一个新的子类对象。
【讨论】: