gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 01:05:07 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com