2010-04-16 17 views
13

Chciałbym być w stanie wykonać następujące czynności:Dodaj właściwości do obiektu stdClass z innego obiektu

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

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

Jak mogę przedłużyć $ obj tak, że zawiera on właściwości $ obj2, np

$obj->status //"success" 

$obj->message // "OK" 

wiem mogę używać tablicy, dodać wszystkie właściwości do tablicy, a następnie rzucić, że z powrotem do obiektu, ale jest tam bardziej elegancki sposób, coś takiego:

przedłużyć ($ obj, $ obj2) ; // dodaje wszystkie właściwości z $ obj2 do $ obj

Dzięki!

Odpowiedz

23

To więcej wzdłuż linii oni droga, że ​​nie chcą, aby to zrobić ....

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

Jednak myślę, że byłoby trochę lepsze niż konieczność powtórzenia właściwości.

+0

W końcu wydaje się najbardziej "elegancki", mimo że wymaga obsady do tablicy i z powrotem. Nawiasem mówiąc, jak droga jest odlewanie obiekt-tablica? Czy obejmuje pętlę przechodzącą przez wszystkie właściwości, które są następnie dodawane jako klucze do tablicy? – Florin

5

Można użyć get_object_vars() na jednym obiekcie stdClass, iterację tych, i dodać je do drugiego:

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

Nie wiem, czy chcesz uznać, że bardziej eleganckie, pamiętajcie.

Edycja: Jeśli nie jesteś skąpy w rzeczywistości przechowywania je w tym samym miejscu, spójrz na this answer to a very similar question.

+1

Prawidłowe rozwiązanie, ale domyślam się, że metoda odlewania do tablicy i odwrotności robi to samo, z tym wyjątkiem, że jest wykonywana wewnętrznie w silniku php, który powinien być nieco szybszy. – Florin

+0

Absolutnie. W związku z tym nie ma pewności, czy byłaby to klasa "bardziej elegancka". Obsady mogą być brzydkie, ale nie są wystarczająco brzydkie. :) – pinkgothic

8

jeśli obiekt jest instancją stdClass (to w Twoim przypadku) można po prostu przedłużyć swój przedmiot jak ...

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

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

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

.... i tyle, ile chcesz.

Powiązane problemy