您可以将类实例化为空,然后通过任意数量的方法加载.其中一个方法可以接受父类的实例作为参数,然后从那里复制其数据
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 );
troelskn.. 5
你可以用一些黑魔法来做到这一点,尽管我会在一开始就严重质疑为什么你有这个要求.它表明您的设计存在严重问题.
但是:
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])); }
这与一般的序列化具有相同的限制,这意味着对其他对象或资源的引用将丢失.
您可以将类实例化为空,然后通过任意数量的方法加载.其中一个方法可以接受父类的实例作为参数,然后从那里复制其数据
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 );
你可以用一些黑魔法来做到这一点,尽管我会在一开始就严重质疑为什么你有这个要求.它表明您的设计存在严重问题.
但是:
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])); }
这与一般的序列化具有相同的限制,这意味着对其他对象或资源的引用将丢失.