取消链接和SplFileObject

| 是否可以从SplFileObject取消链接文件? 我看不到一种用于关闭基础资源的方法,并且文件句柄是私有的,因此在实现该目标时就无法扩展SplFileObject。 有什么解决方法吗?     
已邀请:
我不建议这样做,因为PHP会为您关闭后台文件。如果您查看php src,
ext/spl/spl_directory.c
retval.handle = zend_objects_store_put(intern, 
  (zend_objects_store_dtor_t) zend_objects_destroy_object, 
  (zend_objects_free_object_storage_t) spl_filesystem_object_free_storage, 
   NULL TSRMLS_CC);
设置处理程序是为了在所有引用都用完后处理对象的清除。现在,我们检查清理处理程序:
spl_filesystem_object_free_storage
    case SPL_FS_FILE:
        if (intern->u.file.stream) {
            if (intern->u.file.zcontext) {
/*              zend_list_delref(Z_RESVAL_P(intern->zcontext));*/
            }
            if (!intern->u.file.stream->is_persistent) {
                php_stream_free(intern->u.file.stream, PHP_STREAM_FREE_CLOSE);
            } else {
                php_stream_free(intern->u.file.stream, PHP_STREAM_FREE_CLOSE_PERSISTENT);
            }
            if (intern->u.file.open_mode) {
                efree(intern->u.file.open_mode);
            }
            if (intern->orig_path) {
                efree(intern->orig_path);
            }
        }
        spl_filesystem_file_free_line(intern TSRMLS_CC);
        break;
php_stream_free
呼叫将为您关闭文件流。如果取消链接文件,我无法保证PHP将如何处理试图关闭刚刚链接的文件句柄。 您必须记住SplFileObject为您提供了什么:
SplFileObject extends SplFileInfo implements RecursiveIterator , Traversable , Iterator , SeekableIterator {
它为文件提供了许多基于迭代器的接口。如果您对文件“ 6”进行遍历,应该遍历什么?您会注意到,可用方法中也不存在“ 7”。如果您想按照自己的意思去做,那么最好将文件作为资源来处理,可以在其中使用
close()
句柄并使其与
unlink()
一起使用,从而避免了讨厌的副作用。     

要回复问题请先登录注册