【问题标题】:Dependencies and Instantiation依赖和实例化
【发布时间】:2012-11-17 20:26:27
【问题描述】:

我正在尝试将我的网站组件移动到类中。例如下面这个sn-p需要在多个文件中使用,但我不想复制粘贴代码。

<?php
...
require "ActionManager.php";
require "Action.php";
require "includes/pdo.php";

$actionMan = new ActionManager();
$actionMan->setPDO($pdo);
$actionMan->setUserData($data);
echo $actionMan->getActions(3);
?>

好的,我知道我可以使用 spl_autoload_register() 来摆脱前两个要求,但我认为我正在寻找的是某种依赖容器,因此我最终不会重复此代码,并且当它改变时把自己搞砸了。

我还发现自己在很多类中重复 setPDO() 和 setUserData() 方法。

有人能指点我正确的方向吗?

【问题讨论】:

  • Symfony 有一个不错的独立依赖注入容器。试试看那里。
  • 您重复相同的代码?那么也许你应该把它抽象成一个函数/类,然后只用改变的变量来调用它......?

标签: php oop dependency-injection autoload


【解决方案1】:

require 语句不应该在那里,而是自动加载您的依赖项。 Anthony Ferrara 有一篇关于 costs and benefits of autoloading 的精彩博客文章,他总结说,总体而言,自动加载是最好的解决方案。

对我来说,您的其余代码看起来有点像引导代码。您创建一个 ActionManager 的新实例并通过 setter 方法注入两个依赖项。如果这确实是依赖层次结构顶层的引导代码,则可以使用new。我不喜欢的是,显然您的依赖项是在所需文件中创建的,而您却无法说出是否已经需要这些实例(没有延迟实例化选项)。

根据您的整个应用程序,您可能希望考虑使用 DIC,但我不太喜欢它们。您可以在没有 DIC 的情况下进行正确的构造函数注入。实际上,大多数情况下,人们最终会错误地使用 DIC,并重新创建 DI 应该解决的问题。

如果您要向我们展示更多您的架构,我们或许可以就如何处理常见依赖项提供更具体的建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 2019-11-23
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    相关资源
    最近更新 更多