0

我正在为我的项目创建一个非常基本的应用程序框架,它使用标准 MVC 方法并支持模块(我称之为应用程序)。有许多像$URI, $ROUTER, $PROFILE,etc. 这样创建的全局对象,并且可以访问全局库,如 Array Helpers 和 Calendar generators。所有这些都类似于 Codeigniter 或 FuelPHP 以及任何数量的其他框架,但我们想要一些特定于我们需求的东西并决定从头开始(借用和修改上面的一些库)。

我的问题是这个。如果一个模块加载了日历库,并且日历库不需要构造函数变量或依赖项(即每个 new\Calendar都相同),有没有办法确保只创建一个日历对象?因此,如果模块 2 尝试创建模块 1 已经创建的日历对象,系统将交付相同的对象。我应该澄清一下,多个模块可以同时运行(为什么我们需要一个新框架)。

我听说过关于单身人士的可怕事情,并且对工厂没有印象(我可能没有正确使用)。

什么是最佳实践?

谢谢!

4

3 回答 3

1

控制系统的反转怎么样?您可以创建一个全局 IOC 对象,该对象具有创建对象的指令,但也具有包含对已创建对象的引用的注册表。在模块的注册部分中,您希望表现“单例”的每个项目,您只需检查它是否已被实例化。我能想到的唯一其他选择是,由于您不希望构造任何东西,因此将其设置为无法实例化和静态访问该类的静态类(Calendar::printSomeFunction)。但是,我并不反对单例模式,因为它的价值在于正确使用它。我只是在这里选择更优雅的解决方案,例如#1,因为它非常灵活。你不 但是,对于开发人员是否在 IOC 模块之外创建类有很大的控制权,因此您可以考虑以某种方式保护它。希望对您的决策过程有所帮助。

于 2013-06-11T19:53:00.313 回答
1

如果您使用会话标志怎么办?

if(!$_SESSION['calender']){
    $calander = new Calander();
    $_SESSION['calender'] = true;
}

这对你有用吗?

于 2013-06-11T19:54:46.057 回答
0

您需要的是类似服务容器的东西。喜欢:

$server_container->add_service("my calendar", "Calendar");

然后任何需要日历(或"my calendar"具体)的模块都可以用以下方式构建:

$mymodule = new MyModule($service_container->get_service("my calendar"));

class MyModule {
    public function __construct(Calendar $calendar) { /*..*/ }
}

单例很糟糕,因为它使您的代码无法测试。使用上面的代码,您可以用$calendar实现Calendar. 正确的 DI 会争辩说您也需要 a ,CalendarInterface但您可能具有不允许您进行区分的依赖项。

于 2013-06-11T19:53:31.260 回答