我是 OOP 的新手,我最近有 asked question , 这让我想到:
- 每个“操作”都应该在单独的类中实现,
- 我遇到的问题应该通过依赖注入(inject)来解决,
- 我不能整个应用程序只有一个对象。
假设我有以下代码:
class FtpConnect {
public $server;
private function connect () { ... }
public __construct ($db, $mailer, $server) {
$this->server = $server;
$this->connect();
}
}
class Database {
public $database_property;
...
}
class Phpmailer {
public $phpmailer_property;
...
}
$db = new Database();
$mail = new Phpmailer();
$ftp = new Ftpconnect ($db, $mail, "ftp.mozilla.org");
$ftp->db->database_property;
$ftp->mail->phpmailer_property;
这是正确的方法吗?看来我还有一个对象$ftp
。
读取属性或调用像 $ftp->db->database_property;
这样的方法是正确的方法吗?
最佳答案
在您的示例中有一些好事和一些坏事!首先,祝贺您认真尝试学习良好的编程实践。你走对了方向!
好东西:
- 您正在使用正确的构造函数注入(inject)(DI 的形式),因此您只在示例的最高级别编写
new
语句,而不是在类内部。 - 您为每个不同的服务编写了一个类,太棒了。
坏事:
- 您正在通过 ftp 实例访问数据库和邮件的属性,不要那样做!
- 您正在使用公共(public)属性,将属性设为私有(private)并使用公共(public) getter 和 setter
- 你在构造函数中调用 main 方法,不要那样做,你不应该在类内部调用它,而应该在类外部调用它。
- 您没有对传递给 ftp 实例的 $mailer 实例做任何事情,ftp 类真的需要 mailer 类吗?
改进的示例,假设您的 ftp 类确实需要数据库和邮件:
class FtpConnect {
private $db;
private $mailer;
private $server;
public function connect () { ... }
public __construct ($db, $mailer, $server) {
$this->setServer($server);
$this->setMailer($mailer);
$this->setDb($db);
}
public setServer($server)
{
$this->server = $server;
}
public setDb($db)
{
$this->db = $db;
}
public setMailer($mailer)
{
$this->mailer = $mailer;
}
}
class Database {
private $databaseProperty;
public getDatabaseProperty()
{
return $this->databaseProperty;
}
}
class Phpmailer {
private $phpmailerProperty;
public ... see above...
}
$db = new Database();
$mail = new Phpmailer();
$ftp = new FtpConnect ($db, $mail, "ftp.mozilla.org");
$ftp->connect();
$someProperty = $db->getDatabaseProperty();
关于php - PHP 中的依赖注入(inject)——简单示例回顾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12895586/