php - PHP 中的依赖注入(inject)——简单示例回顾

标签 php oop

我是 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/

相关文章:

PHP 后期静态绑定(bind)引用

php - 使用 Div 显示 MySql 数据

javascript - 函数内部的 javascript 函数是全局作用域的吗?

c# - 使用接口(interface)如何克服C#中的多重继承问题?

sql - 如何用面向对象的 Perl 组装 SQL?

PHP正则表达式跨多行搜索

php - 从 php 代码中删除数据库

php - Wordpress 开发人员自定义背景选项

javascript - jquery oop 覆盖方法函数

java - 复制构造函数不起作用