Unlink и SplFileObject
Можно ли отсоединить файл от SplFileObject?
Я не вижу метода для закрытия базового ресурса, и дескриптор файла является частным, поэтому нельзя расширять SplFileObject с этой целью.
Есть ли обходные пути?
1 ответ
Я не рекомендовал бы это, потому что 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 {
Он предоставляет много основанных на итераторах интерфейсов для файла. если ты unlink
файл, что он должен перебирать? Вы заметите, что close()
также отсутствует в доступных методах. Если вы хотите сделать то, что вы говорите, то вам лучше обрабатывать файл как ресурс, где вы можете close()
ручка и сделать его пригодным для использования с unlink()
Спасая от неприятных побочных эффектов.