【问题标题】:php mixing singleton with dependency injectionphp混合单例与依赖注入
【发布时间】:2014-05-10 09:44:31
【问题描述】:

我发现自己处于不确定自己应该走哪条路的境地。到目前为止,我正在使用依赖注入,我将 PDO 对象作为依赖传递给。

这很好用,但现在我需要一个 Context 类,例如保存当前用户的信息。可能是这样的:

class Context
{
    private $Pdo;

    function __construct(PDO $Pdo) {
        $this->Pdo = $Pdo;
    }

    function CurrentUser(){
        if ($this->CurrentUser == null){
            // get user logic 
                        $this->CurrentUser = User;
        }
        return $this->CurrentUser;
    }
}

因此,每次我想获取当前用户时,我都需要执行以下操作:

$Context = new Context($Pdo);
$User = $Context->CurrentUser();

我希望能够在项目中的任何地方使用它,但 PDO 不会传递给存在的每个方法。

我可以创建一个单例类来在我需要的任何地方获取 PDO 对象,并在我的 Context 类中使用它。这是一个很好的方法吗?还是工厂设计会更好?

到目前为止,我在这种情况下使用 global,但随着项目的快速发展,我可能希望避免使用。

【问题讨论】:

    标签: php dependencies singleton mixing


    【解决方案1】:

    我可以创建一个单例类来在任何地方获取 PDO 对象 需要并在我的 Context 类中使用它。这是一个很好的方法吗? 还是工厂设计会更好?

    好吧,Singleton 和 Factory 并不是一回事,您的特定需求应该决定解决方案。

    这是more in-depth post的简短摘要:

    单例模式将类的实例化限制为单个对象。这提供了跨整个应用程序的单点访问,并确保您始终处理同一个对象。

    工厂模式在每次调用时都会提供对象的新实例。这可能是也可能不是同一个例子。本质上,工厂定义了一个用于创建对象的接口。

    因此,您的需求将决定哪种模式更适合您的应用程序。如果您想要一个对象的单个实例,请使用单例。

    【讨论】:

    • 嘿,感谢您的输入,但是我知道设计模式是如何工作的,我更感兴趣的是在这种特殊情况下哪种方法最好,因为 Context 类可以随时随地使用。 . :) 这会被视为一种特殊的不良做法吗?我似乎找不到更好的方法..
    • @user3370402 - 如果你想让你的 PDO 对象的单个实例随处可用,单例模式就可以了。如果您想尝试替代方案,请考虑使用注册表模式......但我认为 Simpleton 将更容易实现/理解。我对单例有复杂的感觉,但它们被广泛使用并且非常容易实现,所以如果它解决了你的问题,那就去吧。
    猜你喜欢
    • 2012-03-20
    • 1970-01-01
    • 2015-11-08
    • 2022-10-16
    • 2012-02-29
    • 1970-01-01
    • 2011-12-16
    • 2013-05-26
    • 2011-10-27
    相关资源
    最近更新 更多