Клонированный объект должен использовать один дескриптор файла или у каждого свой собственный?

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

  •  18-09-2019
  •  | 
  •  

Вопрос

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

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

У меня есть вопросы:

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

Решение

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

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

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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top