依赖注入 - 静态函数

4

我理解了依赖注入的基本概念(例如用于数据库),但我无法想象如何在静态函数中使用它:

class Foo{
    private $id; 
    private $class_variables,...;
    private $db;
    public function __construct($db,$id,$class_varibles,...)
    {
        $this->db=$db;
        //Assignments
    }

    public static function Get_By_ID($id)
    {
     //No DB-Connection here
     return new Foo(?);
    }
}

这样做的唯一方法是以下方式吗?
class Foo{
     ...
     public static function Get_By_ID($db,$id)
     {
        //Do work here!
        return new Foo($db,$id,$class_variables,...);
     }

对于几个静态函数而言,这似乎是很多额外的工作。

此外:

$f = new Foo($db);

只能使用已保存在(private $db)中的"$db"来创建新对象。

$b = $f->Create_Bar();

您如何解决这个问题?唯一的方法是:
$b = $f->Create_Bar($db_for_bar);

附加说明:如何使用静态函数实现此操作?
$b = Foo::Create_Bar($db_for_foo,$db_for_bar);

What am I missing?

(Additional 2:

 $f = new Foo($db); //Dependency Injection ($db is saved in $f, and is the database-link for example)
 $f->Create_Bar($db_for_bar); //OK - No Problem

但如果“Create_Bar”在“Foo”内部调用呢?

 $this->Create_Bar(???) //Where does the $db_for_bar come from?

)

1个回答

1
这是一个很好的解决方案,我不明白为什么你说它不起作用:
class Foo{
     ...
     public static function Get_By_ID($db,$id)
     {
        return new Foo($db,$id,$class_variables,...);
     }

1
它可以工作,但我需要使用 $b = Foo::Create_Bar($db_for_foo,$db_for_bar),这样好吗?例如,如果_Foo_创建一个_Bar_(如果它使用几个“子类”怎么办?我是否必须使用仅具有不同对象数据库的函数)另外:$f = new Foo($db);如果在类内调用非静态函数$f->Create_Bar($db_for_bar);,例如:$this->Create_Bar(???)。我从哪里获取$db_for_bar? - SpazzMarticus
好的,我理解这并不是非常实用。我认为根本问题在于每个模型类中都有一个DB对象,并且在模型类中使用DI很困难(因为你在代码中到处使用“new MyModel”)。如果我是你,我不会太过于担心DI,或者我会改变模型类的设计(例如使用Doctrine),使得模型类不再持有DB对象。 - Matthieu Napoli
(在第二种情况下,DB对象将被注入到“repositories”中,而不是模型类中,而且repositories就像服务一样,因此很容易使用DI与它们配合使用) - Matthieu Napoli
我是http://php-di.org的作者,我非常支持依赖注入。然而,当你遵循其他设计模式和关注点分离时,它变得非常有用和适当。因此,我会说如果你全面采用所有最佳实践,你将获得很多好处。如果你在一个小项目上,或者不想投入太多时间,那么使用单例是可以的,并且可以完成工作。如果你正在启动一个大型/复杂的应用程序,那么单例(和你当前的模型架构)很快就会出现问题。所以这取决于你的需求,有选择而不是“一种好的方法”来做事情。 - Matthieu Napoli
多年后,我终于有机会使用php-di,并且我非常喜欢它的工作方式! - SpazzMarticus
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接