如何将PHP对象复制到其他对象类型

时间:2020-03-06 14:34:53  来源:igfitidea点击:
  • 新类是原始对象的子类
  • 它需要与php4兼容

解决方案

我想我们将不得不发明某种"复制构造函数"。然后,我们将在传递原始对象的同时创建一个新的子类对象。

最好的方法是在子类上创建一个克隆方法,以便我们可以执行以下操作:

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

或者,听起来我们可以查看装饰器模式php示例

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

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

一个php对象与一个数组没有太大不同,并且由于所有PHP 4对象变量都是公共的,因此我们可以做一些混乱的事情,例如:

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

它不是很漂亮,而且从某种意义上说,它不是我认为的好习惯,但是它是可重用的,而且非常简洁。

我们可以使用一些黑魔法来做到这一点,尽管我会严重质疑我们为什么首先具有此要求。这表明设计存在严重错误。

尽管如此:

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

这通常与序列化受到相同的限制,这意味着丢失了对其他对象或者资源的引用。