[英]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();
我不会写出整个代码,但您可以实现的一种方法是:
header()
function 会立即发送到浏览器,并且不会返回任何内容)。请注意,这不是唯一真正的解决方案。 每个项目的细节都会有所不同,您可能会改变对正确抽象的想法,因为您需要将它用于不同的事情。 但是,从具体的东西开始 - zip 文件本身 - 您可能会更好地了解 object 的用途。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.