2010-07-22 10 views
5

Powiel możliwe:
What is the best method to merge two PHP objects?Jak scalić dwa obiekty?

Mam obiekt, $ foo, który ma kilka metod i właściwości już zdefiniowane i innego obiektu, $ bar, który jest po prostu zbiorem właściwości . Chcę połączyć cały pasek $ $ w $ foo tak, aby wszystkie właściwości $ bar stały się właściwościami $ foo.

Więc jeśli wcześniej miałem, $ bar-> foobar, potem powinienem móc użyć $ foo-> foobar.

Obecnie robię następujący:

foreach($bar as $key => $value) { 
    $foo->$key = $value; 
    } 

Jednak gdybym za pomocą tablic, chciałbym po prostu wykonaj jedną z następujących czynności:

$foo += $bar; 

$foo = array_merge($foo, $bar); 

istnieje podobny sposób robić to z obiektami, czy robię to już we właściwy sposób?

Należy pamiętać, że nie co $ bar do siebie stają się własnością $ foo czyli nie $ foo-> bar-> foobar

Odpowiedz

3

Jeśli $ bar ma wszystkie właściwości $ foo, wtedy jest to Foo . Zatem twoja klasa Bar powinna przedłużyć (dziedziczyć z) Foo. (Lub vice versa, jeśli mam pomieszane nazwy)!

Jeśli z jakiegoś powodu nie chcesz używać dziedziczenia, możesz zatrzymać jeden obiekt wewnątrz drugiego i przekierować połączenia do jego właściwości z zewnętrznego obiektu dynamicznie za pomocą magicznych metod, takich jak __get() i __set (zobacz here)

0

Nie ma wbudowanej funkcji do kopiowania wszystkich właściwości jednego obiektu do drugiego.

Sposób, w jaki to robisz, jest prawdopodobnie najprostszy. Alternatywą dla zapewnienia klasy $ foo metodą __get, która zwraca właściwość bezpośrednio z $ bar.

15

Spróbuj kod

echo $obj->name; //show: carlos 
echo $obj2->lastname; //show: montalvo here 

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

$obj_merged->name; //show: carlos 

$obj_merged->lastname; //show: montalvo here 
+0

Jest to odpowiedź, na pewno? –

+1

Należy zauważyć, że ta metoda działa tylko w przypadku właściwości, a nie metod w wersji php <= 5.4, o ile wiem. – PowerAktar

+0

Czy można dołączyć obiekt, aby '$ obj' zawierał zarówno' $ obj' i '$ obj2'? – Moseleyi