我们有两个PHP5对象,并希望将其中一个的内容合并到第二个对象中。它们之间没有子类的概念,因此不能应用下面主题中描述的解决方案。

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

//We have this:
$objectA->a;
$objectA->b;
$objectB->c;
$objectB->d;

//We want the easiest way to get:
$objectC->a;
$objectC->b;
$objectC->c;
$objectC->d;

备注:

这些是对象,不是类。 对象包含相当多的字段,因此foreach会相当慢。 到目前为止,我们考虑将对象A和B转换为数组,然后在重新转换为对象之前使用array_merge()将它们合并,但如果这样我们不能说我们感到自豪。


当前回答

我会把第二个对象链接到第一个对象的属性中。如果第二个对象是函数或方法的结果,请使用引用。例:

//Not the result of a method
$obj1->extra = new Class2();

//The result of a method, for instance a factory class
$obj1->extra =& Factory::getInstance('Class2');

其他回答

考虑到对象A和B,有一个非常简单的解决方案:

foreach($objB AS $var=>$value){
    $objA->$var = $value;
}

这是所有。你现在有了objA和objB的所有值。

如果你的对象只包含字段(没有方法),这是可行的:

$obj_merged = (object) array_merge((array) $obj1, (array) $obj2);

当对象具有方法时,这实际上也适用。(使用PHP 5.3和5.6进行测试)

这段代码将递归地将该数据转换为单一类型(数组或对象),而不需要嵌套的foreach循环。希望它能帮助到一些人!

一旦一个对象变成数组格式,你就可以使用array_merge并在需要的时候转换回Object。

abstract class Util {
    public static function object_to_array($d) {
        if (is_object($d))
            $d = get_object_vars($d);

        return is_array($d) ? array_map(__METHOD__, $d) : $d;
    }

    public static function array_to_object($d) {
        return is_array($d) ? (object) array_map(__METHOD__, $d) : $d;
    }
}

程序的方式

function object_to_array($d) {
    if (is_object($d))
        $d = get_object_vars($d);

    return is_array($d) ? array_map(__FUNCTION__, $d) : $d;
}

function array_to_object($d) {
    return is_array($d) ? (object) array_map(__FUNCTION__, $d) : $d;
}

所有功劳归于杰森·奥克利

\ArrayObject类可以交换当前数组以断开原始引用。为此,它提供了两个方便的方法:exchangeArray()和getArrayCopy()。剩下的就是所提供对象的ArrayObjects公共属性的简单array_merge():

class MergeBase extends ArrayObject
{
     public final function merge( Array $toMerge )
     {
          $this->exchangeArray( array_merge( $this->getArrayCopy(), $toMerge ) );
     }
 }

用法如下:

 $base = new MergeBase();

 $base[] = 1;
 $base[] = 2;

 $toMerge = [ 3,4,5, ];

 $base->merge( $toMerge );

合并任意数量的原始对象

function merge_obj(){
    foreach(func_get_args() as $a){
        $objects[]=(array)$a;
    }
    return (object)call_user_func_array('array_merge', $objects);
}