我正在制作一个MVC应用程序。 我在加载器类中创建了这个函数:
public function load_models($model)
{
if ($model) {
set_include_path($this->modelDirectoryPath);
spl_autoload_extensions('.php');
spl_autoload($model);
}
}
我从我的控制器使用这个函数,就像这样:
$this->load->load_models('news');
我想像这样访问这个模型类:
$this->load->news->get_article();
但我不能,除非我这样做:
$this->load->news = new news();
$this->load->news->get_article();
我想在不输入 $this->load->news = new news();
的情况下访问它。 我还希望它自动实例化。谁能帮忙?
使 get_article() 成为静态方法并像这样访问它:
$this->load->news::get_article();
如果不实例化类的至少一个实例,则无法访问非静态方法。 即使有反射,你实际上也不能调用和常规方法。
您可以在负载类中实现一个魔术方法,当您访问任何属性(例如
$this->load->news->get_article();
它检查 'news' 属性的名称是否也加载了类名,如果是,但它未设置为类的实例,请创建一个并将其分配给它。
这是神奇的方法:
public function __get(){ ... } ;
基本上,每次访问对象的...每次访问对象的不可访问属性(未声明或未创建的属性)时
你似乎正在"引导"CodeIgniter的某些东西,它已经过时了(如果你想了解细节,请转到PHP聊天室)。如果你想要高质量的代码,那将不是要模拟的框架。
哦,你正在实现的模式实际上是MVP,而不是MVC..有区别。
-
首先,您应该制作自动加载机,这实际上有效。阅读有关
spl_autoload_register()
的信息..它是如何被使用的,它实际上做了什么。如果您需要一些示例,除了注释中提供的示例之外,您还可以查找 PSR-0 的实现。它应该给你一些想法,如何在实践中使用它。这一切基本上可以摆脱控制器中的
$this->load->load_models('news');
行。 -
在MVC中,模型是一个层而不是一个对象/类。我不打算重复整首歌和舞蹈,我前段时间写了一个答案..它很长=/
-
您不应该在控制器内部使用
new
,但原因与您认为的相同。你应该避免new
,因为它会导致与类名的紧密耦合。相反,您应该在构造函数中为Controller
实例提供Factory
。$factory = new DomainFactory( new PDO(...), $cache ); $controller = new Foobar( $factory ); $controller->$command($request);
您可以在控制器方法中使用,如下所示:
public function __construct( $domain_factory ) { $this->factory = $domain_factory } public function do_stuff( $request ) { $id = $request->getQuery('id'); $articles = $this->factory->build('news')->get_article($id); // thought i would split this line into two parts }
哦..工厂会做什么,将是这样的:
public function __construct( $pdo, $cache ) { $this->pdo = $pdo; $this->cache = $cache; } public function build( $name ) { $instance = new $name; $instance->assign_connection( $this->pdo ); $instance->assign_cache( $this->cache ); return $instance; }
这应该给你一些想法..
这里有一些链接,如果你想学习如何做好的面向对象代码,它遵循最佳实践,你可能会觉得有帮助:
- 图形用户界面体系结构
<= start with this
- 继承、多态性和测试
- 高级 OO 模式(幻灯片)
- 单元测试
- 敏捷设计的原则
- 全局状态和单例
- 不要找东西!
- 超越框架(幻灯片)
- 敏捷性和质量(幻灯片)