20

我希望能够做到以下几点:

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

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

如何扩展 $obj 使其包含 $obj2 的属性,例如:

$obj->status //"success"

$obj->message // "OK"

我知道我可以使用一个数组,将所有属性添加到数组中,然后将其转换回对象,但是有没有更优雅的方法,如下所示:

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

谢谢!

4

4 回答 4

32

这更像是你不想这样做的方式......

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

但是我认为这比必须迭代属性要好一些。

于 2010-04-16T12:12:19.950 回答
12

如果对象是 stdClass 的实例(在您的情况下),您可以简单地扩展您的对象,例如...

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

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

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

.... 和你想要的一样多。

于 2012-08-07T10:32:28.787 回答
5

您可以在其中一个对象上使用get_object_vars()stdClass,遍历这些对象,然后将它们添加到另一个对象:

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

于 2010-04-16T12:22:50.937 回答
1

看看对象克隆http://php.net/manual/en/language.oop5.cloning.php

于 2010-04-16T11:58:54.237 回答