Geklonte Objekt sollten einzelne Datei-Handle verwenden oder jede hat ihre eigenen?

StackOverflow https://stackoverflow.com/questions/2002742

  •  18-09-2019
  •  | 
  •  

Frage

Ich arbeite an einem Wrapper, der eine Datendatei für ein vorhandenes Web-Tool analysiert. Aber ich bin mit großer Dateien, damit ich nicht die ganze Sache in den Speicher geladen werden kann, so muss ich gehen durch sie es in kleine Stücke zu laden. Das bestehende Web-Tool erwartet Daten in einem Stil ähnlich wie SimpleXML ($ obj-> parentnode-> childnode-> childNode gibt einen String oder ein Knotenobjekt irgendeine Art). Zum Glück ist die Struktur ähnlich wie XML, aber die Syntax ist ungerade. Und ich kann es nicht nur wegen mildernden Umstände zu einem vernünftigen Format übersetzen. So habe ich es im laufenden Betrieb zu emulieren.

Als ich durch die Datei gehen will ich nicht den ganzen Baum zu analysieren mehr brauchen, sondern nur die Unterknoten Namen des aktuellen Knotens. Jeder Teilknotennamen und zugeordneten Offset wird in den übergeordneten Knoten gespeichert werden. Wenn Inhalt eines untergeordneten Knoten zugegriffen werden muss dann die Eltern-Knoten Objekt geklont wird, Offset-Werte aktualisiert werden und die untergeordneten Knoten Objekt beginnt es Parsen Inhalt, bis er die angeforderten untergeordneten Knoten findet.

Die Fragen, die ich habe, sind:

  • Klonierung des übergeordneten Knoten Objekt Kind Klone, die die Datei-Handle geben. Sollten alle Klone verwenden den gleichen Griff und verwenden fseek um die Datei zu springen, wenn nötig (und das ist eine ziemlich große if)?
  • Muss ich die Datei schließen? Oder wird die Garbage Collection am Ende der Skriptausführung es schließen? Welche Gefahren habe ich Gesicht, wenn ich es nicht tun?
  • Müssen ich Griffe für jeden Klon erstellen, oder sollte ich bleiben mit ihnen ein zu teilen? Wenn dies der Fall ist es eine Obergrenze?
  • Gibt es eine Möglichkeit für ein geklonte Objekt einen Verweis auf das ursprüngliche Objekt zu halten? Wenn ich den Griff nahe im Objekt destructor bin setzen sollte ich wohl schließen Sie es nicht, wenn das Objekt ein Klon ist. Und nach oben verfolgen zu können, kann sich als nützlich erweisen, möglicherweise.
War es hilfreich?

Lösung

Wenn Sie die __clone Methode implementieren Sie tun können, was Sie wollen, wenn Sie ein Objekt klonen wie eine Eigenschaft festlegen es als Klon flaggin und oder eine Eigenschaft festlegen, die den Eltern hält.

Bearbeiten

public function __clone()
{
  $clone = clone $this;
  $clone->isCloned = true;
  $clone->parent = $this;
  $clone->resource = $this->resource; // i dont think resources are copied be default
  // additional property transference
  return $clone;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top