Я бы не рекомендовал это, потому что 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()
, спасая от неприятных побочных эффектов.