Add properties to stdClass object from another object
Asked Answered
C

4

20

I would like to be able to do the following:

$obj = new stdClass;
$obj->status = "success";

$obj2 = new stdClass;
$obj2->message = "OK";

How can I extend $obj so that it contains the properties of $obj2, eg:

$obj->status //"success"

$obj->message // "OK"

I know I could use an array, add all properties to the array and then cast that back to object, but is there a more elegant way, something like this:

extend($obj, $obj2); //adds all properties from $obj2 to $obj

Thanks!

Colangelo answered 16/4, 2010 at 11:55 Comment(0)
B
33

This is more along the lines of they way that you didn't want to do it....

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

However I think that would be a little better than having to iterate over the properties.

Boson answered 16/4, 2010 at 12:12 Comment(1)
After all, seems the most 'elegant', even though it involves a cast to array and back. By the way, how expensive is a object-to-array cast ? Does it involve a loop through all properties which are then added as keys to the array?Colangelo
D
12

if the object is the instance of stdClass (that's in your case) you can simply extend your object like...

$obj = new stdClass;
$obj->status = "success";

$obj2 = new stdClass;
$obj2->message = "OK";

$obj->message = $message;
$obj->subject = $subject;

.... and as many as you wish.

Derisive answered 7/8, 2012 at 10:32 Comment(0)
S
5

You could use get_object_vars() on one of the stdClass object, iterate through those, and add them to the other:

function extend($obj, $obj2) {
    $vars = get_object_vars($obj2);
    foreach ($vars as $var => $value) {
        $obj->$var = $value;
    }
    return $obj;
}

Not sure if you'd deem that more elegant, mind you.

Edit: If you're not stingy about actually storing them in the same place, take a look at this answer to a very similar question.

Snitch answered 16/4, 2010 at 12:22 Comment(2)
A valid solution, but I guess the cast-to-array-and-back method does the same thing, except it's done internally in the php engine which should be a bit faster.Colangelo
Absolutely. Hence not being sure whether this would class as 'more elegant'. Casts may be ugly, but they're not really ugly enough. :)Snitch
T
1

have a look at object cloning http://php.net/manual/en/language.oop5.cloning.php

Trelliswork answered 16/4, 2010 at 11:58 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.