2010-04-16 34 views
13

我想能够做到以下几点:从另一个目的是stdClass的对象添加的属性

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

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

我怎么能OBJ,使其包含的$ obj2的属性,例如延长$

$obj->status //"success" 

$obj->message // "OK" 

我知道我可以使用一个数组,所有的属性添加到数组,然后强制转换回对象,但有一个更优雅的方式,这样的事情:

扩展($ OBJ,$ OBJ 2) ; //将$ obj2添加到$ obj中的所有属性

谢谢!

回答

23

这是沿,你不想这样做,他们的行路更....

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

不过,我认为这将是比不必迭代属性好一点。

+0

毕竟,尽管它涉及阵列和背部,但它似乎是最“优雅”的。顺便说一下,对象到数组的转换有多昂贵? 它是否涉及到所有属性的循环,然后将其作为关键字添加到数组中? – Florin 2010-04-19 13:21:03

5

你可以在stdClass对象的一个​​使用get_object_vars(),通过这些迭代,并将它们添加到其他:

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

不知道你会认为这更优雅,你介意。

编辑:如果你不吝啬存放他们在同一个地方,看看this answer to a very similar question

+1

一个有效的解决方案,但是我猜这个cast-to-array-and-back方法会做同样的事情,除非它在php引擎中内部完成,应该快一点。 – Florin 2010-04-19 13:22:52

+0

当然。因此不确定这是否会被评为“更优雅”。演员可能很丑,但他们并不够丑。 :) – pinkgothic 2010-04-19 13:57:07

8

如果对象是stdClass的实例(这是你的情况),你可以简单地扩展你的对象像...

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

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

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

....,并根据需要尽可能多的。

相关问题