首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >依赖注入简单实现

依赖注入简单实现
EN

Stack Overflow用户
提问于 2010-01-09 04:48:01
回答 1查看 1.9K关注 0票数 4

在读完this问题后,我想知道是否有人能帮助我理解如何正确地使用这些PHP类实现依赖注入:

代码语言:javascript
复制
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;
    }
}

会话类:

代码语言:javascript
复制
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();
        ...
     }
}   

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

代码语言:javascript
复制
class User
{
    private $username;
    private $role;
    private $session;

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

外部:

代码语言:javascript
复制
$connection=new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);
$database=new DBClass($connection);
$session=new Session($database);
$user=new User($session);

这是正确的方式吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-01-09 05:11:40

是。您现在可以通过构造函数注入依赖项,这样可以减少耦合。你现在可以更容易地交换出这些依赖项,例如,当UnitTesting时,你可以用Mocks替换它们。

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

要只创建类的单个实例(如注释中所述),您可以使用Singleton (就像Kevin Peno建议的那样)或Factory来创建并跟踪实例是否已经创建。或者使用DI Service Container,它类似于Factory,但不是一回事。它为您创建和管理对象。

Symfony Components library has a Dependency Injection Container提供了优秀的文档,并介绍了有关如何使用服务容器进一步增强DI的主题。容器也可以用来限制实例。看看这个。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2030624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档