gpt4 book ai didi

php - 通过依赖注入(inject)传递静态类

转载 作者:可可西里 更新时间:2023-11-01 12:38:00 25 4
gpt4 key购买 nike

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

例如Carbon使用静态方法:

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

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

我有以下 Controller :

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

我如何将 Carbon 传递给它?

最佳答案

静态方法之所以被称为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');

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

关于php - 通过依赖注入(inject)传递静态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41184647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com