我们有一个使用大量静态方法的库。但是,这使PHPUnit中的测试变得困难,因为我无法模拟那些静态方法调用。因此,我正在删除静态关键字并逐步迁移静态调用,例如:
$users = App_Model_User::find(...);
..为:
$users = App_ServiceLocator::get('model.user')->find(...);
这将允许我在测试时交换项目。但是,在模型库中,我们有许多静态定义的方法和调用,例如:
// method declaration
public static function find(...) {...
// method calls within the class
$result = static::find(...);
我开始从方法声明中删除静态关键字,但我有点不确定如何声明方法调用。我尝试将static
替换为self
,但这有效,但我不知道这是否正确。我不想使用$ this,因为我们将处于某个状态,我们的部分应用程序正在静态调用find,而更新的部分或已更改的部分正在使用服务定位器:
public function someMethod()
{
$result = self::find(...); // is this correct? I want to be able to call find here statically as well as when an instance without breaking things
顺便说一下,我们没有以严格的模式运行。我知道严格模式可能是一个不错的选择。我从Laravel那里得到了一颗心,因为我知道它能够以静态方式或实例方法调用相同的方法:
User::where(...)->get();
// $user instance passed into the controller action
$user->where(...)->get();
...我希望,我希望我所做的事情并不是一件坏事。对此有任何建议表示赞赏