我想我明白为什么使用其他静态方法的方法难以测试。当我说测试时,我正在考虑单元测试。
举个例子:
class foo { protected $objA; public function m1() { $objA = new A(); $objA->show(); } public function m2() { A::show(); } public function m3() { $this->objA->show(); } public function m4($objA) { $objA->show(); } }
我做对了吗?
答案 0 :(得分:1)
M1并不完美,因为你在方法本身中有一个类的具体引用,所以你是正确的,因为你将无法模拟它。在这种情况下,您应该使用依赖注入将对象引用传递给方法。
M2几乎是相同的情况,因为它使用的是具体参考,但正如您所指出的,它使用的是静态方法。静态方法很难模拟,因为没有办法创建一个定义静态方法的接口(我说的是.Net背景,我不确定你是否可以在PHP中接口静态方法,但我对此表示怀疑)。 / p>
M3,看起来你正在使用属性注入,在这种情况下是的,这是一个容易模拟的测试,因为该对象在类本身之外被实例化并传递给它。
M4与M3相同,因为依赖注入以方法参数的形式出现。
理想情况下,依赖注入应该在类级别完成,可以使用属性或构造函数参数。构造函数参数通常被视为首选方法,因为属性注入(至少从我的角度来看)有点松散,而构造函数注入会强制您创建一个具有所需依赖关系的类。