Mamy dwa obiekty PHP5 i chcielibyśmy połączyć zawartość jednego w drugi. Pomiędzy nimi nie ma podklas, dlatego nie można zastosować rozwiązań opisanych w poniższym temacie.
Jak skopiować obiekt PHP na inny typ obiektu
//We have this:
$objectA->a;
$objectA->b;
$objectB->c;
$objectB->d;
//We want the easiest way to get:
$objectC->a;
$objectC->b;
$objectC->c;
$objectC->d;
Uwagi:
- To są obiekty, a nie klasy.
- Obiekty zawierają dość dużo pól, więc foreach byłby dość wolny.
- Do tej pory rozważamy przekształcenie obiektów A i B w tablice, a następnie scalenie ich za pomocą array_merge () przed ponownym przekształceniem w obiekt, ale nie możemy powiedzieć, że jesteśmy z tego dumni.
Odpowiedzi:
Działa to również wtedy, gdy obiekty mają metody. (testowany z PHP 5.3 i 5.6)
źródło
stdclass
. Chociaż „działa” w pewnym sensie na obiekty metodami, w tym przypadku skutecznie niszczy obiekt (usuwając metody).Możesz stworzyć inny obiekt, który będzie wywoływał wywołania metod magicznych do obiektów znajdujących się pod spodem. Oto jak sobie z tym poradzisz
__get
, ale aby w pełni funkcjonować, musisz zastąpić wszystkie odpowiednie magiczne metody. Prawdopodobnie znajdziesz błędy składniowe, ponieważ właśnie wprowadziłem go z góry głowy.Powodzenia.
źródło
źródło
$objectB
przechowywane są scalone dane.Rozumiem, że użycie ogólnych obiektów [stdClass ()] i rzutowanie ich jako tablice odpowiada na pytanie, ale myślałem, że Kompozytor był świetną odpowiedzią. Jednak czułem, że przydałoby się ulepszenie niektórych funkcji i może być przydatne dla kogoś innego.
Cechy:
Kod:
Stosowanie:
Przykład:
źródło
foreach($objects as &$object) $this->with(&$object);
goforeach($objects as &$object) $this->with($object);
rozwiązuje problem. Źródło: [ php.net/manual/en/language.references.pass.php]if($this->first_precedence) array_push($this->composite, &$object); else array_unshift($this->composite, &$object);
należy zastąpić przezif($this->first_precedence) array_push($this->composite, $object); else array_unshift($this->composite, $object);
Bardzo proste rozwiązanie, biorąc pod uwagę, że masz obiekt A i B:
To wszystko. Teraz masz objA ze wszystkimi wartościami z objB.
źródło
\ArrayObject
Klasa ma możliwość wymiany aktualną tablicę odłączyć oryginalną odniesienia . Aby to zrobić, oferuje dwie przydatne metody:exchangeArray()
igetArrayCopy()
. Reszta jest po prostu prostaarray_merge()
z podanego obiektu oArrayObject
publicznych właściwościach:Użycie jest tak proste:
źródło
merge($array)
faktycznie poprosił o\ArrayObject
również.rozwiązanie Aby zachować zarówno metody, jak i właściwości ze scalonych obiektów, należy utworzyć klasę kombinatora, która może
proste użycie
źródło
Chciałbym połączyć drugi obiekt z właściwością pierwszego obiektu. Jeśli drugi obiekt jest wynikiem funkcji lub metody, użyj odwołań. Dawny:
źródło
Aby scalić dowolną liczbę surowych obiektów
źródło
Oto funkcja, która spłaszczy obiekt lub tablicę. Użyj tego tylko, jeśli masz pewność, że twoje klucze są unikalne. Jeśli masz klucze o tej samej nazwie, zostaną one zastąpione. Musisz umieścić to w klasie i zastąpić „Funkcje” nazwą swojej klasy. Cieszyć się...
źródło
Uprośćmy to!
Jeśli to nie odpowie na twoje pytanie, z pewnością pomoże w uzyskaniu odpowiedzi. Podziękowania dla powyższego kodu należą do mnie :)
źródło
Ten fragment kodu będzie rekurencyjnie przekształcał te dane w pojedynczy typ (tablicę lub obiekt) bez zagnieżdżonych pętli foreach. Mam nadzieję, że to komuś pomaga!
Gdy obiekt ma format tablicowy, możesz użyć array_merge i w razie potrzeby przekonwertować go z powrotem na obiekt.
Sposób proceduralny
Wszystkie podziękowania należą się: Jason Oakley
źródło