2010-01-04 3 views
0

Я работаю над оболочкой, которая анализирует файл данных для существующего веб-инструмента. Тем не менее, я использую большие файлы данных, поэтому я не могу загрузить все это в память, поэтому я должен пройти через него, загружая его небольшими кусками. Существующий веб-инструмент ожидает, что данные в стиле, подобном SimpleXML ($ obj-> parentnode-> childnode-> childnode, возвращают строку или объект-узел какого-либо типа). К счастью, структура похожа на XML, но синтаксис нечетный. И я не могу просто перевести его в нормальный формат из-за смягчающих обстоятельств. Поэтому я должен подражать ему на лету.Клонированный объект должен использовать одиночный дескриптор файла или у каждого есть свой собственный?

Поскольку я просматриваю файл, мне не нужно будет разбирать все дерево, а именно имена узлов этого узла. Каждое имя узла и связанное с ним смещение будут сохранены в родительском узле. Если необходимо получить доступ к содержимому подузла, то объект-родительский узел будет клонирован, значения смещения будут обновлены, и объект под-узла начнет разбирать его контент до тех пор, пока он не найдет запрошенный субнод.

Вопросы у меня есть:

  • Клонирование объект родительского узла даст ребенок клонов дескриптор файла. Должны ли все клоны использовать один и тот же дескриптор и использовать fseek, чтобы прыгать по файлу, если это необходимо (и это довольно большой, если)?
  • Нужно ли мне закрыть файл? Или будет ли сбор мусора в конце выполнения скрипта закрыть его? С какими опасностями я сталкиваюсь, если нет?
  • Должен ли я создавать ручки для каждого клона, или я должен придерживаться их совместного использования? Если да, то есть верхний предел?
  • Есть ли способ клонированного объекта сохранить ссылку на исходный объект? Если я помещаю дескриптор в деструктор объекта, я, вероятно, не должен его закрывать, если объект является клоном. И, возможно, может быть полезно отслеживать вверх.

ответ

0

Если вы реализуете __clone метод, вы можете делать все, что вы хотите при клонировании объекта как значение свойства flaggin как клон и или установить свойство, которое удерживает родитель.

редактировать:

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; 
} 
+0

Хорошо, это маркировки как клон я получаю. Но как я могу ссылаться на исходный объект? $ this-> parent =? what? –

+0

см. Мое редактирование для очень элементарного примера. – prodigitalson

+0

Я думал, что __clone был вызван клоном при создании? Кроме того, ни один из примеров кода не возвращает клон. –