Добавить свойства в объект stdClass из другого объекта - PullRequest
16 голосов
/ 16 апреля 2010

Я бы хотел сделать следующее:

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

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

Как мне расширить $ obj, чтобы он содержал свойства $ obj2, например:

$obj->status //"success"

$obj->message // "OK"

Я знаю, что мог бы использовать массив, добавить все свойства в массив и затем привести его обратно к объекту, но есть ли более элегантный способ, примерно такой:

extend ($ obj, $ obj2); // добавляет все свойства из $ obj2 в $ obj

Спасибо!

Ответы [ 4 ]

24 голосов
/ 16 апреля 2010

Это больше похоже на то, что вы не хотели этого делать ...

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

Однако я думаю, что это было бы немного лучше, чем перебирать свойства.

10 голосов
/ 07 августа 2012

если объект является экземпляром stdClass (это в вашем случае), вы можете просто расширить свой объект как ...

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

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

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

.... и столько, сколько вы хотите.

5 голосов
/ 16 апреля 2010

Вы можете использовать get_object_vars () для одного из объектов stdClass, выполнять итерацию по ним и добавлять их к другому:

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

Не уверен, что вы считаете это более элегантным, заметьте.

Редактировать: Если вы не скупитесь на самом деле хранить их в одном месте, взгляните на этот ответ на очень похожий вопрос .

1 голос
/ 16 апреля 2010

взгляните на клонирование объектов http://php.net/manual/en/language.oop5.cloning.php

...