Клонированный объект должен использовать один дескриптор файла или у каждого свой собственный?
Вопрос
Я работаю над оболочкой, которая анализирует файл данных для существующего веб-инструмента.Однако я использую большие файлы данных, поэтому не могу загрузить их целиком в память, поэтому мне приходится проходить через них, загружая их небольшими частями.Существующий веб-инструмент ожидает данные в стиле, аналогичном 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;
}