gpt4 book ai didi

php - 依赖注入(inject)简单实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:07:18 25 4
gpt4 key购买 nike

看完this我想知道是否有人可以帮助我理解如何使用这些 PHP 类正确实现依赖注入(inject):

class DBClass
{
private $mMysqli;
function __construct(mysqli $database)
{
$this->mMysqli=$database;
}
function __destruct()
{
$this->mMysqli->close();
}

public function listUsers()
{
$query='SELECT * FROM Utente;';
$resultset=$this->mMysqli->query($query);
while($row = $resultset->fetch_array(MYSQLI_ASSOC)) {
echo $row['username'];
echo $row['pwd'];
echo "<br />\n";
}

}

public function runQuery($query)
{
return $resultset=$this->mMysqli->query($query);
}

public function getConnection()
{
return $this->mMysqli;
}
}

session 类:

class Session
{
private $_session;
public $maxTime;
private $database;

public function __construct(DBClass $database)
{
$this->database=$database;
$this->maxTime['access'] = time();
$this->maxTime['gc'] = get_cfg_var('session.gc_maxlifetime');
session_set_save_handler(array($this,'_open'),
array($this,'_close'),
array($this,'_read'),
array($this,'_write'),
array($this,'_destroy'),
array($this,'_clean')
);
register_shutdown_function('session_write_close');
session_start();
...
}
}

用户类别(有关当前登录用户的详细信息):

class User
{
private $username;
private $role;
private $session;

function __construct($session)
{
$this->session=$session;
...
}
}

外部:

$connection=new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);
$database=new DBClass($connection);
$session=new Session($database);
$user=new User($session);

这是正确的方法吗?

最佳答案

是的。您现在通过提供更少耦合的构造函数注入(inject)依赖项。您现在可以更轻松地交换这些依赖项,例如当进行 UnitTesting 时,您可以将它们替换为 Mocks。

尽管使用具体的 DBClass 作为 TypeHint 而不是 interface,您仍然有一些耦合。 .因此,当您想要使用不同的 DBClass 时,必须将其命名为 DBClass。您可以通过 coding against an interface 实现更松散的耦合具体类必须改为实现。

要仅创建类的单个实例(如评论中所述),您可以使用单例(如 Kevin Peno 建议的那样)或工厂来创建并跟踪实例是否已创建。或者使用 DI 服务容器,它类似于工厂,但不是一回事。它为您创建和管理对象。

Symfony Components library has a Dependency Injection Container以及关于如何使用服务容器进一步增强 DI 的主题的优秀文档和介绍。容器也可用于限制实例。检查一下。

关于php - 依赖注入(inject)简单实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2030624/

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