通过依赖注入传递静态类

9

如何通过依赖注入将静态类传递给对象?

例如,Carbon使用静态方法:

$tomorrow = Carbon::now()->addDay();

我有一些依赖于Carbon的服务,目前我在依赖项中使用该库而不注入它们。但是,这增加了耦合度,我想通过DI将其传递。

我有以下控制器:

$container['App\Controllers\GroupController'] = function($ci) {
    return new App\Controllers\GroupController(
        $ci->Logger,
        $ci->GroupService,
        $ci->JWT
    );
};

如何将Carbon传递到其中?

Carbon::now() 返回什么?一个对象。 - u_mulder
没错,是一个对象。但我并不总是需要一个实例,因为我还会使用类中的其他方法,比如 Carbon::createFromDateCarbon::createFromTimestamp - BugHunterUK
1
你可以传递一个对象或者什么都不传递。 - u_mulder
1个回答

3

静态方法被称为static,因为它们可以在不实例化类对象的情况下调用。因此,您不能传递 static class (即使 static class 不是一个合法术语)。

可用的选项有:

  1. Pass object of Carbon:now() to your constructor:

    $container['App\Controllers\GroupController'] = function($ci) {
        return new App\Controllers\GroupController(
            $ci->Logger,
            $ci->GroupService,
            $ci->JWT,
            \Carbon:now()          // here
        );
    };
    
  2. Pass a callable object:

    $container['App\Controllers\GroupController'] = function($ci) {
        return new App\Controllers\GroupController(
            $ci->Logger,
            $ci->GroupService,
            $ci->JWT,
            ['\Carbon', 'now']   // here or '\Carbon::now'
        );
    };
    

    And later create Carbon instance using something like:

    $carb_obj = call_user_func(['\Carbon', 'now']);
    $carb_obj = call_user_func('\Carbon::now');
    
使用第二个选项,您可以动态定义函数名称。

为什么static class不是一个合法的术语?我想我将不得不继续直接将Carbon导入到我的服务中,因为我并不总是需要使用Carbon::now。有时我需要使用Carbon::createFromTimestamp。无论如何,还是谢谢你,我会接受这个答案,因为它基本上回答了我的问题。 - BugHunterUK
“static class” 不是一个合法的术语,因为可以有静态属性或静态方法。即使你的类只有静态属性/方法,你仍然可以创建它的实例(尽管你将没有太多选项如何使用它)。 - u_mulder
啊,我明白你的意思了。PHP没有像C#等其他语言那样定义静态类的概念。虽然将构造函数设置为私有方法可以防止类被实例化,或者创建一个仅包含静态属性和方法的抽象类也可以。再次感谢。 - BugHunterUK

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