【发布时间】:2011-03-09 21:00:34
【问题描述】:
简介
我正在开发一个 MVC 框架,但遇到了问题。看来我试图完成的是所谓的单例设计方法——只初始化一次类。请记住,我试图在控制器 "acontroller" 中尽可能少地编写代码。
话虽如此,最后一个问题仍然存在:如何将对象添加到已经实例化的对象中?
拥有或至少查看实际源代码可能会有所帮助,而不仅仅是示例源代码,因此我已将源代码推送到我的 github。你可以在这里找到:https://github.com/derekmaciel/uMVC
代码说明
首先发生的是“幕后”,
- Controller 类加载位于 /application/controller 中的控制器,在本例中为“acontroller”。
- 之后,acontroller 类使用 Load 类加载模型(称为“amodel”),使用 $this->load->model("amodel"),该模型在 Controller __construct 中实例化。
- $this->load->model("amodel") 的最终结果是:$controller->amodel =& new Amodel(),其中 $controller 是 Controller 实例(不是控制器,因为控制器加载型号会有所不同)。
- 步骤 4:允许控制器访问已加载的模型 (amodel)。
代码结果
可以在此处找到这些脚本的当前输出的副本:http://pastebin.com/EJxuXaki
您会注意到的第一件事是,我收到了使用已弃用分配的警告。我现在将专注于错误。
您会注意到的第二件事是我首先 print_r()'d 控制器实例。里面有一个amodel对象,要添加到控制器中。
在那之后,我打印了 $this(控制器)对象。它拥有从 __construct() 获得的一切,但没有模型。
如果我能让控制器“看到”模型,那么我的问题就会解决。
还有: 无论如何我可以从控制器 acontroller 中删除“parent::init()”吗?我这样做只是为了让控制器可以同时访问 Load 和 Model 类,但我试图在控制器中放置尽可能少的代码,因此让控制器自动访问 Load 和 Model 会有很大帮助。
我希望我很清楚。感谢您的帮助
【问题讨论】:
-
你的设计坏了。控制器没有理由成为单例。事实上,there is no reason to use Singletons in PHP at all。 And you should not use the
globalkeyword either. -
@Gordon 单例设计是我能想到的唯一方法,因为替代方案是依赖注入;我的目标是避免在我的应用程序中放置“系统”代码,并且只允许核心这样做。我需要找到一种方法,让我的应用程序可以访问我的 Core 可以访问的相同内容。
-
Weeeell,我猜你的框架首先是作为一个学习练习,所以继续犯这些错误:) 以后意识到它坏了没有错。