从函数 PHP 将对象作为类属性返回


return objects as a class property from function php

我正在制作一个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 模式(幻灯片)
  • 单元测试
  • 敏捷设计的原则
  • 全局状态和单例
  • 不要找东西!
  • 超越框架(幻灯片)
  • 敏捷性和质量(幻灯片)