2010-04-16 95 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; 

....,並根據需要儘可能多的。

相關問題