繁体   English   中英

PHP OOP 方法/this/self 最佳实践

[英]PHP OOP methods/this/self best practice

所以我已经使用 OOP 完成了一些项目,但我真的不明白如何使用 $this 以及如何正确访问 class 中的方法。

这是一个工作示例,我的问题不是如何做,而是如何正确/最佳实践。

示例 1:

/**
 * ZipHandler.
 */
class ZipHandler
{
    private $files = [];
    private $zipName;
    private $zip;
    private $headers;

    /**
     * __construct.
     *
     * @param mixed files
     * @param mixed zipName
     *
     * @return void
     */
    public function __construct($files, $zipName)
    {
        $this->files = $files;
        $this->zipName = $zipName;
        $this->zip = new ZipArchive();
    }

    /**
     * createZip.
     *
     * @return void
     */
    public function createZip()
    {
        $this->zip->open($this->zipName, ZipArchive::CREATE);
        foreach ($this->files as $file) {
            $this->zip->addFile($file, basename($file));
        }
        $this->zip->close();
    }

    /**
     * setHeaders.
     *
     * @return void
     */
    public function setHeaders()
    {
        $this->headers = header('Content-Type: application/zip');
        $this->headers = header('Content-disposition: attachment; filename='.$this->zipName);
        $this->headers = header('Content-Length: '.filesize($this->zipName));

        return $this->headers;
    }

    /**
     * readTheFile.
     *
     * @return void
     */
    public function readTheFile()
    {
        readfile($this->zipName);
    }

    /**
     * __destruct.
     *
     * @return void
     */
    public function __destruct()
    {
        self::createZip();
        self::setHeaders();
        self::readTheFile();
    }
}

// Output:
$newZip = new ZipHandler(['testfile.jpg'], 'test.zip');

正如您在此示例中所看到的,我正在析构函数中运行这些方法。 这样做的原因和问题是什么?

示例 2:

/**
 * ZipHandler.
 */
class ZipHandler
{
    private $files = [];
    private $zipName;
    private $zip;
    private $headers;

    /**
     * __construct.
     *
     * @param mixed files
     * @param mixed zipName
     *
     * @return void
     */
    public function __construct($files, $zipName)
    {
        $this->files = $files;
        $this->zipName = $zipName;
        $this->zip = new ZipArchive();
    }

    /**
     * createZip.
     *
     * @return void
     */
    public function createZip()
    {
        $this->zip->open($this->zipName, ZipArchive::CREATE);
        foreach ($this->files as $file) {
            $this->zip->addFile($file, basename($file));
        }
        $this->zip->close();
    }

    /**
     * setHeaders.
     *
     * @return void
     */
    public function setHeaders()
    {
        ob_clean();
        $this->headers = header('Content-Type: application/zip');
        $this->headers = header('Content-disposition: attachment; filename='.$this->zipName);
        $this->headers = header('Content-Length: '.filesize($this->zipName));

        return $this->headers;
    }

    /**
     * readTheFile.
     *
     * @return void
     */
    public function readTheFile()
    {
        readfile($this->zipName);
    }

}


// Output:
$newZip = new ZipHandler(['testfile.jpg'], 'test.zip');
$newZip->createZip();
$newZip->setHeaders();
$newZip->readTheFile();

正如您在此处看到的,我没有为 output 使用析构函数或 self::。

像示例 1、2 中那样做正确的方法还是我完全迷路了?


如果问题不清楚,请随时告诉我,以便我尝试改写。

可能你遇到问题的主要原因是你的 class 代表了一些非常抽象的东西 - 拥有一个名为“ZipHandler”的 class 不一定是错误的,但它使得它代表什么以及它实际上什么时候做的事情变得不那么明显了。 编程艺术正在提出抽象,让您将您的需求转化为您和计算机都能理解的术语。

如果你用英文写了描述,你可能会说“创建一个 zip 文件;将一些文件添加到 zip 文件;将 zip 文件发送到浏览器”。 这是您希望代码翻译的要求,因此您可以尝试使代码以相同的方式读取:

$zipFile = new ZipFile('test.zip');
$zipFile->addFiles(['testfile.jpg']);
$zipFile->sendToBrowser();

我不会写出整个代码,但您可以实现的一种方法是:

  • class 称为 ZipFile,因为它代表单个文件。 如果您需要两个 zip 文件,则需要两个对象。
  • 构造函数采用 zip 文件名,并立即在磁盘上创建空的 zip 文件。
  • addFiles 方法将文件直接添加到 zip 文件中,而不仅仅是内部数组。 您可以多次调用它来添加更多文件,或者使用“addSingleFile”或“addAllInDirectory”等其他方法
  • sendToBrowser 方法输出正确的 HTTP 标头,然后是文件内容,因为一旦您发送了这些标头,您就不想输出任何其他内容或更改 zip 文件的大小。 (顺便说一句, header() function 会立即发送到浏览器,并且不会返回任何内容)。
  • 析构函数通常不应该做任何你注意到的事情; 它在那里进行您不想忘记的无聊清理。 在这种情况下,它可能会关闭磁盘上的 zip 文件,以确保它没有被锁定以防止其他进程访问; 或者它可能会完全删除该文件,如果您只是将其用作临时文件以供一次性使用。

请注意,这不是唯一真正的解决方案。 每个项目的细节都会有所不同,您可能会改变对正确抽象的想法,因为您需要将它用于不同的事情。 但是,从具体的东西开始 - zip 文件本身 - 您可能会更好地了解 object 的用途。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM