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

Posted

技术标签:

【中文标题】如何将 PHP 对象复制到不同的对象类型中【英文标题】:How do you copy a PHP object into a different object type 【发布时间】:2010-09-12 06:25:41 【问题描述】:

    新类是原始对象的子类

    需要兼容php4

【问题讨论】:

【参考方案1】:

你可以用一些黑魔法来做到这一点,尽管我会认真地质疑为什么你首先有这个要求。这表明您的设计存在严重问题。

尽管如此:

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】:

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】:

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

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

【讨论】:

这是我目前的解决方案。我想我不能指望任何其他魔法来做到这一点。【参考方案4】:

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

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

另外,听起来您可以查看装饰器模式php example

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于如何将 PHP 对象复制到不同的对象类型中的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Access - 将对象属性复制到同一类型的另一个对象

对象在类中的存储方式有哪些?

为啥不同类型的 Python 对象按类型名称排序? [复制]

PHP错误:不能将stdClass类型的对象用作数组(数组和对象问题)[重复]

如何将对象类型从业务层传递到数据层

php 中如何得到一个对象的类型