如何将一个PHP对象复制到另一个对象类型中?

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

  2. 它需要与php4兼容

5个回答

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

这基本上是我的当前解决方案。我想我不能指望其他什么魔法来做到这一点。 - Azrul Rahim

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

这与通常的序列化一样存在限制,这意味着对其他对象或资源的引用将会丢失。


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

虽然不太美观,也不是我认为的良好实践,但它确实可以重复使用,而且相当不错。


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

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

或者你可以考虑使用装饰器模式php示例


1
我想你可能需要创造一种"拷贝构造函数"。然后,你只需创建一个新的子类对象,并将原始对象传递进去。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接