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

2023-11-24

我一直听到人们谈论依赖注入及其好处,但我并不真正理解它。

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

我尝试阅读维基百科的条目,但该示例是用 Java 编写的,因此我不太清楚它试图阐明的差异。 (http://en.wikipedia.org/wiki/Dependency_injection ).

我读了这篇 php 依赖注入文章(http://www.potstuck.com/2009/01/08/php-dependency-injection/),目标似乎不是直接将依赖项传递给对象,而是封锁对象的创建及其依赖项的创建。不过,我不确定如何在使用 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();

任何人都拥有良好的资源或洞察力,可以使方法和好处一目了然吗?


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

当你不喜欢全局变量时,这就是你在可怕的单例浪潮之前所做的事情:

<?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()到您的用户类别。其余代码无需更改。

你会得到很多关于symfony 的文档

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 为什么在发出带有发布数据的请求后,PHP 中的 $_POST 数组为空

    我使用发布数据向页面 getremote php 发出发布请求 但 POST 数组似乎为空 如果有人能告诉我我做错了什么 我将不胜感激 发出请求的 JavaScript 代码是 var postdata Content Type appli
  • 我是否需要破解 ZendFramework1.10.8/Doctrine1.2.2 才能生成模型?

    我已经开始阅读 zend 框架 它与 Doctrine 一起使用 并实现了一个小项目来掌握理解 我已经到了需要生成模型的地步 就像拥有一个生成脚本一样 如 Doctrine 1 2 中建议的那样 2 pdf 手册 经过几次不成功的尝试 例如
  • MongoDB 给出奇怪的连接错误

    我在使用 PHP 连接 MongoDB 时遇到问题 这是我的代码 这会产生以下错误 Fatal error Uncaught exception MongoConnectionException with message localhost
  • 执行 mysqli->set_charset() 的永久方法?

    将我可以找到的字符集的所有配置文件和运行时选项设置为 utf 8 后 使用 php 建立的新 mysqli 连接的字符集仍然设置为 latin1 这实际上意味着我必须调用 mysqli gt set charset utf8 每次我连接 m
  • 在 php 中检测 iPad?

    如何向 iPad 查看者提供不同的页面 if SERVER HTTP USER AGENT Mozilla 5 0 iPad U CPU iPhone OS 3 2 like Mac OS X en us AppleWebKit 531 2
  • 无法在WordPress的functions.php中使用php fopen()函数

    我正在尝试简单地运行 fopen 函数 php 并且也尝试过test phpWordPress 模板文件 但这不起作用 如果我将 test php 文件和 csv 文件移动到主题文件夹之外的位置 那么它第一次可以工作 function cs
  • PHP Google Drive API - 文件上传仅作为“无标题”-文件或只是没有内容

    我正在寻找一种解决方案 通过 PHP 将文件从我的根服务器直接上传到我的 Google Drive 帐户 授权工作正常 但当我尝试传输文件 例如 test jpg 时 它只是在 Google Drive 中创建一个名为 Untitled 的
  • Symfony 生产日志

    在 Symfony 3 中 我是否可以在不打开调试模式的情况下将所有错误写入生产日志 错误将包括 http 500 错误或应用程序错误或 php 错误 这些错误由于生产时错误标志设置为 false 而被静音 当前生产的日志配置是 monol
  • 有没有办法清除所有会话中的一些会话数据?

    一般来说 我有以下场景 从数据库中获取产品及其相关数据 将获取的数据转换为 php product 对象 在会话中缓存产品对象 缓存是只读的 即客户在网站上查看产品 但也有类似的电话getProductIdsByCategory categ
  • ZF2:如何将参数传递给转发插件,然后我可以在转发它们的方法中获取这些参数?

    我有一个 Action 方法Foo需要参数的控制器 public function fooAction one two a one b two 我需要从某些方法的其他方法转发到该方法Boo控制器 这些参数之一必须是引用参数 唯一的例子就是手
  • Laravel - 如何使用供应商类?

    我想在 m paths php 文件上使用移动检测 我已将该包添加为composer json 中的必需项 并将其安装在供应商文件中 我现在该如何使用它 我尝试了这个答案 但没有成功 因为找不到该课程 Laravel 4 使用供应商类 ht
  • 在订单编辑页面添加自定义元框并将其显示在客户订单页面上

    在 WooCommerce 中 想要在 WooCommerce 管理订单页面上添加自定义元框 在此框中 我只想在保存到该订单的文本字段中输入跟踪号码 然后在客户查看订单页面上 我想显示一个按钮 用于打开带有跟踪信息的模式 该模式只会拉入一个
  • 删除删除线的 unicode 文本?

    我偶尔会收到用户的输入 他们正在使用那些烦人的 stikethrough 文本生成器 这破坏了我的代码 我尝试过在这里找到的一些代码 string preg replace x00 x1F x80 xFF string 它有效 但我需要它只
  • PHP PDO:将数据作为对象获取 - 在调用 __construct 之前分配的属性。它是否正确?

    完整的问题应该是 这是正确的还是我不能指望的错误 为什么这是正确的行为 我一直在更多地使用 PDO 特别是直接将数据提取到对象中 在这样做的过程中我发现了这一点 如果我直接将数据获取到像这样的对象中 STH DBH gt prepare S
  • WooCommerce 添加到购物车后停止重定向

    我希望在用户单击 添加到购物车 按钮后完全删除任何重定向 实际上我没有使用产品页面 我使用一个带有产品链接的简单按钮 如下所示 add to cart 492 我的用户将单击我页面上的多个 添加到购物车 按钮 因此在单击第一个按钮后他无法重
  • ajax - 检查用户名是否存在+如果存在则返回消息

    我试图检查用户想要的用户名是否已被使用 而无需发送表单 基本上是用户名字段的模糊 我遇到了一些麻烦 有几个问题 我有我的输入字段加上js
  • 从php字符串中删除奇怪的字符

    这就是我现在所拥有的 将 RSS feed 绘制到 php 中 RSS feed 中的原始 xml 如下所示 Paul 8217 s Confidence 到目前为止我拥有的 php 是这样的 newtitle item gt title
  • 如何在 PHP 中验证电子邮件? [复制]

    这个问题在这里已经有答案了 如何使用 php5 验证输入值是有效的电子邮件地址 现在我正在使用这段代码 function isValidEmail email pattern a z0 9 a z0 9 a z0 9 a z0 9 a z
  • 为什么 foreach 这么慢?

    PHPBench com http www phpbench com 在每个页面加载上运行快速基准测试脚本 在 foreach 测试中 当我加载它时 foreach 的运行时间是第三个示例的 4 到 10 倍 为什么本机语言构造明显比执行逻
  • 手动检查 php 中的 jpeg 文件结尾标记 ffd9 (?) 以捕获截断错误

    基本上是尝试从集合中删除损坏的 过早结束的 jpeg 文件 我认为如果文件末尾标记不存在 则意味着图像被截断 因此我认为它对我的目的无效 这是检查声音的方法吗 如果是的话 我有什么想法可以在 php 中实现这个吗 cheers 尝试这个 j

随机推荐

  • 将 ImageView 中的图像保存到设备图库

    我正在尝试将图像从 ImageView 保存到设备库 我试过这段代码 代码编辑 URL url new URL getIntent getStringExtra imageURL File f new File url getPath ad
  • 为什么第二个 for 循环总是比第一个循环执行得快?

    我试图弄清楚 for 循环是否比 foreach 循环更快 并使用 System Diagnostics 类来计时任务 在运行测试时 我注意到我放在第一个循环的执行速度总是比最后一个循环慢 有人可以告诉我为什么会发生这种情况吗 我的代码如下
  • 我的 javascript 文件中的 Laravel 4 Blade 语法

    我的主页有一些内联 javascript 与一些刀片语法混合在一起 例如 它一直有效 直到我想将 javascript 移动到外部 file js 每当添加刀片语法时我都会出错 有没有办法可以在我的 javascript files js
  • 为什么在推导类型时会删除模板参数的限定符?

    在使用 Microsoft VisualStudio 2008 构建一个小示例程序时 我注意到传递给模板的类型推导有一个奇怪的事情 考虑这个例子 template
  • 在 C 中, (x==y==z) 的行为是否符合我的预期?

    我可以比较如下三个变量 而不是这样做if x y y z z x 如果所有三个变量具有相同的值 则应执行 if 语句 这些是布尔值 if debounceATnow debounceATlast debounceATlastlast deb
  • 在 Swing 中的组件顶部进行绘制?

    我有一个JPanel添加到JViewport 并且该面板还添加了几个其他面板 我正在尝试实现一种拖动选择 您可以通过拖动鼠标来选择多个组件 我面临的唯一问题是选择矩形被绘制在添加到主组件的组件后面JPanel 我怎样才能在它们上面画画 我的
  • Powershell 彩色目录列表在格式范围内不正确

    我从这里得到了这个彩色目录脚本http tasteofpowershell blogspot com 2009 02 get childitem dir results color coded html function ls regex
  • JPA 和 JSON 运算符本机查询

    我试图让这个查询在 JPA 中工作 SELECT FROM contrat WHERE contrat json gt nom hever 它完美地与postgresql但是当我将它与JPA集成时 出现以下错误 该位置 1 的参数不存在 M
  • 给定 N 个生成器,是否可以创建一个在并行进程中运行它们并生成这些生成器的 zip 的生成器?

    假设我有 N 个生成器gen 1 gen N其中每个都会产生相同数量的值 我想要一台发电机gen这样它就可以在 N 个并行进程中运行 gen 1 gen N 并产生 next gen 1 next gen 2 next gen N 这就是我
  • 静态 HttpClient 仍在创建 TIME_WAIT tcp 端口

    我在 NET Framework 4 5 1 4 6 1 和 4 7 2 中的 HttpClient 中遇到了一些有趣的行为 由于 TCP 端口使用率高的已知问题 我建议在工作中的项目中进行一些更改 以便在每次使用时不处理 HttpClie
  • C++ 异常:抛出 std::string

    当我的 C 方法遇到奇怪的事情并且无法恢复时 我想抛出异常 可以扔一个吗std string指针 这就是我期待做的事情 void Foo Bar if QueryPerformanceTimer m baz throw new std st
  • 投影球体的半径

    我想完善一个上一个问题 如何将球体投影到屏幕上 2 给出了一个简单的解决方案 approximate radius on screen CLIP SPACE world radius cot fov 2 Z with fov field o
  • 相对于容器以百分比宽度定位固定元素

    我知道position fixed使元素相对于视口而不是它的offsetParent但是我有一个问题 我有一个侧面元素需要x空间量 然后是一些固定位置标题元素 我想占用剩余视口宽度的一定百分比 参见小提琴 http jsfiddle net
  • 如何防止自动 AJAX 攻击

    如何防止用户自动发帖 垃圾邮件 Here is my way这样做时 每个页面请求都会有新的 php 会话 这有其自身的局限性 没有多选项卡 我为每个页面使用了新会话来防御 CSRF 和自动攻击 假设我们有一个使用 AJAX 发布线程的论坛
  • 使用 JavaScript 检测对 Iframe 的点击

    我知道不可能知道用户在内部做什么iframe如果是跨域的话 我想做的是跟踪用户是否点击了iframe 我想象一个场景 有一个看不见的东西div在上面iframe以及div然后将点击事件传递给iframe 这样的事情可能吗 如果是的话 我该怎
  • NET Standard 与 Net Core App:创建 .NET Core 项目时(使用控制台或类库)

    I am trying to develop my projects to be cross platform I have created several class libraries in this way 但是 当我使用实体框架构建
  • HDFS 文件比较

    我如何比较两个 HDFS 文件 因为没有diff 我正在考虑使用 Hive 表并从 HDFS 加载数据 然后在 2 个表上使用 join 语句 有没有更好的方法 没有diffhadoop 提供的命令 但实际上您可以在 shell 中使用重定
  • FREETEXTTABLE 的排名始终为 0

    我正在使用 SQLServer 2008 如果我执行以下查询 SELECT FROM FREETEXTTABLE SomeTable Name a name that I know exists 我得到了我期望的行 但排名始终为 0 寻找这
  • 用于参数化继承的元类

    我读过一些关于 Python 元类的教程 我以前从未使用过 但我需要一个来完成相对简单的事情 并且所有教程似乎都面向更复杂的用例 我基本上想创建一个具有一些预先指定的主体的模板类 但将其基类作为参数 由于我从 C D 模板中得到了这个想法
  • 我如何在简单的 php 函数中使用“依赖注入”,我应该打扰吗?

    我一直听到人们谈论依赖注入及其好处 但我并不真正理解它 我想知道这是否是 我始终将数据库连接作为参数传递 问题的解决方案 我尝试阅读维基百科的条目 但该示例是用 Java 编写的 因此我不太清楚它试图阐明的差异 http en wikipe