3

我是 OOP 的新手,我最近问了一个问题,这让我知道:

  • 每个“操作”都应该在单独的类中实现,
  • 我遇到的问题应该通过依赖注入来解决,
  • 对于整个应用程序,我不能有一个对象。

假设我有以下代码:

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;是正确的方法吗?

4

2 回答 2

5

在您的示例中有一些好事和一些坏事!首先,祝贺您认真尝试学习良好的编程实践。你正朝着正确的方向前进!

好东西:

  • 您正在使用正确的构造函数注入(DI 的形式),因此您只new在示例的最高级别编写语句,而在类内部没有。
  • 您为每种不同的服务编写了一个类,太好了。

坏事:

  • 您正在通过 ftp 实例访问 db 和 mail 的属性,不要那样做!
  • 您正在使用公共属性,将属性设为私有并使用公共 getter 和 setter
  • 你在构造函数中调用主要方法,不要那样做,你不应该在类内部而是在外部调用它。
  • 你没有对传递给 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();
于 2012-10-15T12:29:54.900 回答
0

除了传递给它的第三个参数之外,您的构造函数会默默地丢弃所有内容。为什么要在 ftp 中放置一个 db 对象?这看起来有点奇怪。

除此之外,您已经为 db/mail 对象初始化了变量,因此您应该使用它们(更少的链接使代码更易于阅读)或编写如下内容:$ftp = new Ftpconnect (new Database, new Phpmailer, "ftp.mozilla.org");不要让代码变得更加晦涩难懂。

不要给 ftp 对象它不会使用的东西。此外,如果您尝试访问的属性不是特定于实例的(在该类的所有对象中都是相同的),您应该使用类常量或静态变量

于 2012-10-15T12:28:54.773 回答