Php 在调用close()之后,是否有任何方法可以比较ZipArchive对象?

Php 在调用close()之后,是否有任何方法可以比较ZipArchive对象?,php,Php,在编写一些单元测试时,我偶然发现了一个异常困难的问题 简化场景: 创建了Zip存档 它由ZipArchive::addFromString()方法填充 它比关着的还多 在ZipArchive::open()中使用的文件名未知 代码示例 问题 比较zip存档的内容。比较方法可以使用类似于ZipArchive::statidex()的东西 理想情况下,不需要访问文件系统,只从内存中读取zip数据。基于注释 在这种特殊情况下,我不知道归档文件的文件名(不要问为什么),我只有ZipArchive的一个实

在编写一些单元测试时,我偶然发现了一个异常困难的问题

简化场景:
  • 创建了Zip存档
  • 它由
    ZipArchive::addFromString()
    方法填充
  • 它比关着的还多
  • ZipArchive::open()
    中使用的文件名未知
  • 代码示例 问题 比较zip存档的内容。比较方法可以使用类似于ZipArchive::statidex()的东西


    理想情况下,不需要访问文件系统,只从内存中读取zip数据。

    基于注释

    在这种特殊情况下,我不知道归档文件的文件名(不要问为什么),我只有ZipArchive的一个实例

    我想试试这样的东西:

    class MyZipArchive extends ZipArchive{
    
        protected $filename;
    
        #override open
        public function open($filename, $flags=null){
            #store the filename
            $this->filename = $filename;
            return parent::open($filename,$flags);
        }
    
        public function getFilename(){
            return $this->filename;
        }
    
        public function getFileHash(){
            return md5_file($this->filename);
        }
    }
    
    然后在代码中:

    function zipUp() {
        $zip = new MyZipArchive();
        $zip->open(rand() . '.zip', ZipArchive::CREATE);
        $zip->addFromString('test.txt', 'success');
        $zip->close();
    
        return $zip;
    }
    
    $zip1 = zipUp();
    $zip2 = zipUp();
    
    if($zip1->getFileHash() == $zip2->getFileHash()){
           //do something
    }
    

    尝试,
    hash\u file
    很多次,我使用文件哈希作为文件名,并将“users”文件名存储在数据库中。避免了各种各样的问题。当然,这是完全匹配,如果您想要其他类型的匹配,您应该定义标准。
    理想情况下,不需要访问文件系统,只从内存读取zip数据。
    据我所知,一旦关闭文件,它就不再在内存中。也就是说,没有理由以后不能重新打开该文件。@在这种情况下,我不知道归档文件的文件名(不要问为什么),我只有一个
    ZipArchive
    的实例。我将创建一个ZipArchive的包装类(或扩展),您可以跟踪其中的文件名<代码>类MyZipArchive扩展ZipArchive{public function open($filename,$flags=null){$this->filename=$filename;parent::open($filename,$flags);}然后添加
    公共函数getFilename(){return$this->filename;}
    问题解决。
    $zip->filename
    function zipUp() {
        $zip = new MyZipArchive();
        $zip->open(rand() . '.zip', ZipArchive::CREATE);
        $zip->addFromString('test.txt', 'success');
        $zip->close();
    
        return $zip;
    }
    
    $zip1 = zipUp();
    $zip2 = zipUp();
    
    if($zip1->getFileHash() == $zip2->getFileHash()){
           //do something
    }