1

我正在制作一个 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();。我也希望它自动实例化。任何人都可以帮忙吗?

4

2 回答 2

1

使 get_article() 成为静态方法并像这样访问它:

$this->load->news::get_article();

如果不实例化类的至少一个实例,就无法访​​问非静态方法。即使使用反射,您实际上也无法调用常规方法。

您可以在加载类中实现一个魔术方法,当您访问任何属性时,例如

$this->load->news->get_article();

它检查“新闻”属性的名称是否也加载了类名,如果是,但未设置为该类的实例,则创建一个并将其分配给它。

这是神奇的方法:

public function __get(){ ... } ; 

基本上,每次访问对象的...每次访问对象的不可访问属性(未声明或创建的属性)时,总会调用此魔术方法

于 2012-06-18T21:10:49.797 回答
1

您似乎正在“引导”某些严重过时的 CodeIgniter(如果您想了解详细信息,请访问 PHP 聊天室)。如果您想要高质量的代码,那将不是要模拟的框架。

哦,您正在实施的模式实际上是 MVP,而不是 MVC .. 有区别

  • 一开始你应该这样做是make autoloader,它确实有效。阅读spl_autoload_register().. 它是如何使用的,它实际上是做什么的。如果您需要一些示例,除了注释中提供的示例,您可以查找 PSR-0 的实现。它应该给你一些想法,如何在实践中使用它。

    这一切基本上都会摆脱你$this->load->load_models('news');在控制器中的线路。

  • 在 MVC 中,模型是层而不是对象/类。我不打算重复整个歌曲和舞蹈,我前段时间写了一个答案..它很长=/

  • 您不应该new在控制器内部使用,但原因与您认为的不同。您应该避免new使用 ,因为它会导致与类名的紧密耦合。相反,您应该为您的Controller实例提供一个Factoryin 构造函数。

    $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;
    }
    

这应该给你一些想法..

如果您想学习如何编写遵循最佳实践的优秀面向对象代码,这里有一些您可能会发现有用的链接:

于 2012-06-18T21:47:59.310 回答