Domanda

Sto lavorando su un wrapper che analizza un file di dati di uno strumento web esistente. Tuttavia, io sto usando file di grandi dimensioni, quindi non posso caricare il tutto in memoria in modo devo camminare attraverso di essa di caricarla in piccoli pezzi. Lo strumento web esistente si aspetta i dati in uno stile simile a SimpleXML ($ obj-> parentnode-> childnode-> childnode restituisce una stringa o un oggetto nodo di qualche tipo). Per fortuna la struttura è simile a XML, ma la sintassi è dispari. E non posso tradurlo in un formato sano a causa di circostanze attenuanti. Quindi devo emulare al volo.

Mentre cammino attraverso il file che non avrete bisogno di analizzare l'intero albero, solo i nomi sub-nodi del nodo corrente. Ogni nome sub-nodo e associato il correttore saranno memorizzati nel nodo padre. Se il contenuto di un sottonodo devono essere accessibili, allora l'oggetto padre-nodo verrà clonato, valori di offset saranno aggiornati e l'oggetto sottonodo inizierà l'analisi è contenuto finché non trova il sottonodo richiesto.

Le domande che ho sono:

  • La clonazione dell'oggetto nodo padre darà cloni bambino l'handle di file. Qualora tutti i cloni utilizzano la stessa impugnatura e usare fseek per saltare il file, se necessario (e che è un abbastanza grande se)?
  • Ho bisogno di chiudere il file? O sarà garbage collection al termine dell'esecuzione dello script chiuderlo? Quali pericoli faccio io faccia se non lo faccio?
  • Avrò bisogno di creare maniglie per ogni clone, o forse dovrei restare con loro la condivisione di uno? Se è così c'è un limite superiore?
  • C'è un modo per un oggetto clonato per tenere un riferimento all'oggetto originale? Se sto mettendo la maniglia stretta nel distruttore dell'oggetto probabilmente non deve chiudere se l'oggetto è un clone. Ed essere in grado di rintracciare l'alto può rivelarsi utile, possibilmente.
È stato utile?

Soluzione

Se si implementa il metodo __clone si può fare quello che vuoi quando la clonazione di un oggetto come l'impostazione di una proprietà flaggin come un clone e o l'impostazione di una proprietà che contiene il genitore.

modifica

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top