如何将PHP对象复制到不同的对象类型中

时间:2008-09-23 05:30:17

标签: php oop

  1. 新类是原始对象的子类

  2. 需要兼容php4

5 个答案:

答案 0 :(得分:6)

您可以将您的类实例化为空,然后通过任意数量的方法加载。其中一个方法可以接受父类的实例作为参数,然后从那里复制其数据

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 );

答案 1 :(得分: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]));
}

这与一般的序列化有相同的限制,这意味着对其他对象或资源的引用会丢失。

答案 2 :(得分:3)

一个php对象与数组并没有很大的不同,并且由于所有PHP 4对象变量都是公共的,你可以做一些像这样的混乱:

function clone($object, $class)
{
     $new = new $class();
     foreach ($object as $key => $value)
     {
          $new->$key = $value;
     }
     return $new;
}
$mySubclassObject = clone($myObject, 'mySubclass');

它不漂亮,而且它不是我认为的良好做法,但 可以重复使用,而且非常整洁。

答案 3 :(得分:2)

最好的方法是在子类上创建一个克隆方法,以便你可以这样做:

$myvar = $subclass->clone($originalObject)

或者听起来你可以查看装饰器模式php example

答案 4 :(得分:1)

我想你会发明某种“复制构造函数”。然后,您只需在传入原始对象时创建一个新的子类对象。