【发布时间】:2010-12-16 16:57:29
【问题描述】:
在一个理论上的数据库访问类中,我发现我在类中使用了相当多的辅助函数,它们与类的实例无关(以及其他可以被操纵为与类的实例无关的函数)使用依赖注入)。
例如,我有一个函数可以获取变量中其他两个字符串之间的字符串。我一直在考虑将其移至 String_Helper 类或类似的东西。这个函数已经被静态化了。
另外,我有一个查询数据库的函数,query($sql)。连接详细信息由实例提供,但我一直在考虑将其设为静态,并使用query($sql, $connection)。然后,开发人员可以静态调用它,而根本不需要实例化数据库类。
对我来说,问题是:
这样做值得吗?像查询函数这样的函数让我想知道这是否不仅仅是我试图让一切尽可能静态,而没有任何实际需要。在什么情况下您会认为这很有用?
我知道静态函数更难测试,但如果我确保它们的代码完全无依赖(或在必要时使用依赖注入),那么它们肯定和其他所有东西一样容易测试?
目前不用担心,但如果将来我决定使用静态函数扩展类,我就不可能让当前代码使用我的扩展函数。我想到了单例,但出现了同样的问题:代码将调用
Singleton_Class::getInstance(),而不是My_Extended_Singleton_Class::getInstance()。依赖注入似乎是解决此问题的唯一方法,但它可能会导致 API 更加笨拙,因为每个依赖项都必须赋予__construct()上的一个对象。我有一个容器类,它静态保存某些信息,以便可以在脚本中的任何位置(全局范围)访问它们。如果我不能使用静态函数或单例,那么包含不同变量实例的类会很棒。例如可以使用
Container::$objects['MyClass'] = $MyClass_object;,然后剩下的代码就可以访问Container::$objects['MyClass']。如果我扩展 MyClass 类,我可以使用Container::$objects['MyClass'] = $MyExtendedClass_object;,而使用Container::$objects['MyClass']的代码将使用 MyExtendedClass,而不是 MyClass。在我看来,这是迄今为止最好的方法,但我想知道您对此有何看法。
【问题讨论】:
标签: php