2009-05-22 15 views
0

In meiner Aufgabe wäre sehr nett, eine Art von Objekten Serialisierung (für XML-Ausgabe) zu schreiben. Ich habe es schon gemacht, habe aber keine Ahnung, wie man rekursive Links vermeidet.PHP handgemachte Serialisierung Problem

Das Problem ist, dass einige Objekte öffentliche (!) Eigenschaften mit Links zu ihren Eltern haben müssen (es ist wirklich notwendig). Und wenn ich versuche, ein Elternobjekt zu serialisieren, das einige Kinder aggregiert - Kinder mit Links zu Eltern tun Rekursion für immer.

Gibt es eine Lösung für solche Rekursionen wie print_r() ohne Hacks? Ich kann etwas wie "if ($ prop === 'parent')" nicht verwenden, da manchmal mehr als 1 Link zu Eltern aus verschiedenen Kontexten besteht.

Antwort

1

Schreiben Sie Ihre eigene Serialisierungsfunktion und übergeben Sie ihr immer eine Liste der bereits verarbeiteten Artikel. Da PHP5 (ich nehme an, Sie verwenden php5) immer Kopien Verweise auf ein Objekt, können Sie folgendes tun:

public function __sleep() { 
    return $this->serialize(); 
} 
protected function serialize($processed = array()) { 
    if (($position = array_search($this, $processed, true)) !== false) { 
     # This object has already been processed, you can use the 
     # $position of this object in the $processed array to reference it. 
     return; 
    } 
    $processed[] = $this; 
    # do your actual serialization here 
    # ... 
} 
+0

kein nitpicker sein, aber das sollte natürlich sein: return $ this-> serialize(); – n3rd

+0

Schande über mich ... eine Liste der bereits verwendeten Instanzen ist eine schöne Lösung! Ich kann es sogar von außen tun, und es ist nicht notwendig, jede Klasse mit einer Serialisierungsmethode zu versorgen. Vielen Dank für eine großartige Antwort. PS: übrigens, ja php5 natürlich. In PHP4 Fragen über OOP sind eine Ebene mehr schmutzig IMHO. – Jet

+0

@ n3rd: thx, behoben – soulmerge

Verwandte Themen