克隆对象应该使用单个文件句柄还是每个都有自己的?

时间:2010-01-04 22:29:58

标签: php clone fopen

我正在开发一个解析器来解析现有Web工具的数据文件。但是,我正在使用大型数据文件,因此我无法将整个内容加载到内存中,所以我必须完成它以小块加载它。现有的Web工具需要类似于SimpleXML的样式的数据($ obj-> parentnode-> childnode-> childnode返回某个字符串或某种节点对象)。值得庆幸的是,结构类似于XML,但语法很奇怪。而且由于情有可原,我不能把它翻译成一种理智的格式。所以我必须动态模仿它。

当我浏览文件时,我不需要解析整个树,只需解析当前节点的子节点名称。每个子节点名称和关联的偏移量将存储在父节点中。如果需要访问子节点的内容,则将克隆父节点对象,更新偏移值,并且子节点对象将开始解析其内容,直到找到所请求的子节点。

我的问题是:

  • 克隆父节点对象将为子克隆提供文件句柄。是否所有克隆都使用相同的句柄并使用fseek在需要时跳转文件(如果这是一个非常大的话)?
  • 我需要关闭文件吗?或者在脚本执行结束时垃圾收集会关闭吗?如果我不这样做,我会面临什么危险?
  • 我是否需要为每个克隆创建句柄,还是应该坚持让它们共享一个?如果有,是否有上限?
  • 克隆对象是否有办法保存对原始对象的引用?如果我将句柄放在对象析构函数中,如果对象是克隆,我可能不应该关闭它。能够向上追踪可能会派上用场。

1 个答案:

答案 0 :(得分: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;
}