当前位置: 首页 > 面试题库 >

我如何在简单的php函数中使用“依赖注入”,我应该打扰吗?

庄元龙
2023-03-14
问题内容

我一直听到人们在谈论依赖注入及其带来的好处,但是我并不真正了解它。

我想知道这是否是“我一直将数据库连接作为参数传递”的解决方案。

我尝试阅读有关Wikipedia的条目,但是该示例是用Java编写的,因此我不太了解它试图阐明的区别。(http://en.wikipedia.org/wiki/Dependency_injection)。

我读了这篇php-dependency-injection-in文章(http://www.potstuck.com/2009/01/08/php-
dependency-injection/
),看来目标是不将依赖项传递给html" target="_blank">对象直接,但要封锁对象的创建及其依赖项的创建。我不确定如何在使用php函数的上下文中应用它。

此外,是否存在以下依赖关系注入,是否应该在功能上下文中尝试进行依赖关系注入?

版本1 :(我每天创建但不喜欢的那种代码)

function get_data_from_database($database_connection){
    $data = $database_connection->query('blah');
    return $data;
}

版本2 :(不必通过数据库连接,但也许不必进行依赖注入?)

function get_database_connection(){
    static $db_connection;
    if($db_connection){
        return $db_connection;
    } else {
        // create db_connection
      ...
    }
}

function get_data_from_database(){
   $conn = get_database_connection();
   $data = $conn->query('blah');
   return $data;
}

$data = get_data_from_database();

版本3 :(“对象” /数据的创建是分开的,并且数据库代码仍然是,所以也许这可以算作依赖注入?)

function factory_of_data_set(){
    static $db_connection;
    $data_set = null;
    $db_connection = get_database_connection();
    $data_set = $db_connection->query('blah');
    return $data_set;
}

$data = factory_of_data_set();

任何人都有很好的资源或独到的见解可以使方法和收益清晰明了?


问题答案:

依赖注入是“我的构造函数中还有更多参数”的一个大词。

这是您在不喜欢Globals的可怕Singleton浪潮之前所做的事情:

<?php
class User {
    private $_db;
    function __construct($db) {
        $this->_db = $db;
    }
}

$db   = new Db();
$user = new User($db);

现在,诀窍是使用单个类来管理您的依赖项,如下所示:

class DependencyContainer 
{
    private _instances = array();
    private _params = array();

    public function __construct($params)
    {
        $this->_params = $params;
    }

    public function getDb()
    {
        if (empty($this->_instances['db']) 
            || !is_a($this->_instances['db'], 'PDO')
        ) {
            $this->_instances['db'] = new PDO(
                $this->_params['dsn'],
                $this->_params['dbUser'], 
                $this->_params['dbPwd']
            );
        }
        return $this->_instances['db'];
    }
}

class User
{
    private $_db;
    public function __construct(DependencyContainer $di)
    {
         $this->_db = $di->getDb();
    }
}

$dependencies = new DependencyContainer($someParams);
$user = new User($dependencies);

您必须认为自己只是另一类,而且更加复杂。但是,您的用户类可能需要一些信息来记录消息,例如许多其他类。只需将getMessageHandler函数添加到您的依赖项容器中,并将一些添加$this->_messages = $di->getMessageHandler()到您的用户类中。其余代码没有任何变化。



 类似资料:
  • 我正试图在计算机上实现这个例子https://developer.android.com/jetpack/docs/guide.这就解释了Android应用程序的结构。 当我使用相同的代码时,我会出现以下错误。 我可以找出这个错误与 当我为ViewModel编写默认的零输入构造函数时,我得到了以下错误。 我想不出这个错误的原因和解决方法。

  • 我有一个时间触发的Azure功能

  • 问题内容: 在访问我的数据库时,我让用户填写了一个表单,并且在目标页面中,发布的值用于生成的MySQL查询中。 但是,由于某种原因,MySQL不喜欢我在命令中使用$ _POST变量,并且仅当我定义(例如)然后将$ user直接放在SQL命令中时,MySQL才起作用。 另一方面,我可以在不需要特定列名的INSERT语句中使用$ _POST值: 如果我尝试在INSERT语句中定义了属性(例如),则会出

  • 问题内容: 为什么不应该使用函数的技术原因是什么?(例如,或)? 为什么我要使用其他东西,即使它们在我的网站上工作? 如果它们在我的网站上不起作用,为什么我会收到类似的错误 警告:mysql_connect():没有那个文件或目录 问题答案: MySQL 扩展: 未在积极开发中 被正式弃用的PHP 5.5(发布2013年6月)。 自 PHP 7.0起 已完全删除 (2015 年 12 月发布) 这

  • 问题内容: 想要改善这篇文章吗? 提供此问题的详细答案,包括引文和为什么答案正确的解释。答案不够详细的答案可能会被编辑或删除。 为什么不应该使用功能的技术原因是什么?(例如,或)? 即使我的网站上可以工作,我为什么还要使用其他东西? 如果它们在我的网站上不起作用,为什么会出现类似 警告:mysql_connect():没有这样的文件或目录 问题答案: MySQL扩展: 没有积极发展 被 正式 弃用

  • 本文向大家介绍webapi中如何使用依赖注入,包括了webapi中如何使用依赖注入的使用技巧和注意事项,需要的朋友参考一下 本篇将要和大家分享的是webapi中如何使用依赖注入,依赖注入这个东西在接口中常用,实际工作中也用的比较频繁,因此这里分享两种在api中依赖注入的方式Ninject和Unity;由于快过年这段时间打算了解下vue.js,所以后面对webapi的分享文章可能会慢点更新,希望支持