views:

67

answers:

3

I have an object, $foo, which has some methods and properties already defined and another object, $bar, which is just a set of properties. I want to merge the entirety of $bar into $foo such that all the properties of $bar become properties of $foo.

So if beforehand I had, $bar->foobar, afterwards I should be able to use $foo->foobar.

At the moment, I am doing the following:

foreach($bar as $key => $value) {
    $foo->$key = $value;
    }

However, if I were using arrays, I would just do one of the following:

$foo += $bar;

$foo = array_merge($foo, $bar);

Is there a similar way of doing this with objects or am I doing it the right way already?

Please note that I do not what $bar to itself become a property of $foo i.e. not $foo->bar->foobar

+2  A: 

If $bar has all of $foo's properties, then it is a Foo. Thus, your Bar class should extend (inherit from) Foo. (Or vice versa, if I got your names confused!)

If you don't want to use inheritance for some reason, you can keep one object inside the other, and redirect calls to the other's properties from the outer object dynamically via magic methods like __get() and __set (see here)

J Cooper
A: 

There is no built-in function to copy all properties of one object to another one.

The way you do it is probably the simplest. An alternative to provide the class of $foo with a __get method which returns the property directly from $bar.

Sjoerd
+1  A: 

Try this code

echo $obj->name;  //show: carlos
echo $obj2->lastname; //show: montalvo here

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

$obj_merged->name; //show: carlos

$obj_merged->lastname; //show: montalvo here
Zephiro