6

SplFileObject からファイルのリンクを解除することは可能ですか?

基になるリソースを閉じるメソッドが表示されず、ファイル ハンドルがプライベートであるため、その目的を念頭に置いて SplFileObject を拡張することはできません。

回避策はありますか?

4

1 に答える 1

10

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().

于 2011-05-20T00:55:11.193 に答える