通过Dependancy Injection传递静态类

Bug*_*rUK 8 php dependency-injection slim pimple

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

例如,Carbon使用静态方法:

$tomorrow = Carbon::now()->addDay();
Run Code Online (Sandbox Code Playgroud)

我有依赖Carbon的服务,目前我在依赖中使用库而不注入它们.但是,这增加了耦合,我想通过DI传递它.

我有以下控制器:

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

我如何将碳传递给它?

u_m*_*der 3

调用静态方法是因为无需static实例化类对象即可调用它们。所以,你不能通过(甚至不是一个法律术语)。static classstatic class

可用选项有:

  1. 将对象传递Carbon:now()给构造函数:

    $container['App\Controllers\GroupController'] = function($ci) {
        return new App\Controllers\GroupController(
            $ci->Logger,
            $ci->GroupService,
            $ci->JWT,
            \Carbon:now()          // here
        );
    };
    
    Run Code Online (Sandbox Code Playgroud)
  2. 传递一个可调用对象:

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

    然后Carbon使用类似以下内容创建实例:

    $carb_obj = call_user_func(['\Carbon', 'now']);
    $carb_obj = call_user_func('\Carbon::now');
    
    Run Code Online (Sandbox Code Playgroud)

使用第二个选项,您可以动态定义函数名称。