【问题标题】:Passing static classes via Dependancy Injection通过依赖注入传递静态类
【发布时间】:2017-05-02 06:21:48
【问题描述】:

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

例如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() 返回什么?一个对象
  • 是的,一个对象。但我并不总是需要实例,因为我还使用类中的其他方法,例如 Carbon::createFromDateCarbon::createFromTimestamp
  • 要么传递一个对象,要么什么都不传递。

标签: php dependency-injection slim pimple


【解决方案1】:

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

可用选项有:

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

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

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

    然后使用类似的东西创建Carbon 实例:

    $carb_obj = call_user_func(['\Carbon', 'now']);
    $carb_obj = call_user_func('\Carbon::now');
    

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

【讨论】:

  • 为什么static class 不是一个法律术语?我认为我将不得不继续将 Carbon 直接导入我的服务,因为我并不总是需要使用 Carbon::now。有时我需要使用Carbon::createFromTimestamp。无论如何,谢谢,会接受,因为这几乎可以回答问题。
  • static class 不是法律术语,因为可以有静态属性或静态方法。即使您的类只有静态道具/方法,您仍然可以创建它的实例(尽管您没有太多选择如何使用它)
  • 啊,我明白你的意思了,PHP 没有像 C# 等其他语言那样定义静态类。尽管将构造函数设置为私有方法会停止实例化类。或者创建一个只包含静态属性和方法的抽象类。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多