SplFileObject からファイルのリンクを解除することは可能ですか?
基になるリソースを閉じるメソッドが表示されず、ファイル ハンドルがプライベートであるため、その目的を念頭に置いて 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 {
ファイル用の多くの反復子ベースのインターフェイスを提供します。ファイルの場合unlink
、何を反復する必要がありますか? close()
利用可能なメソッドにも存在しないことに気付くでしょう。あなたが言っていることをしたい場合は、ファイルをリソースとして処理する方が良いでしょclose()
うunlink()
.