13xs 2020-04-14 16:33 采纳率: 0%
浏览 389

关于thinkPHP6 的“容器的依赖注入”疑问

在tp6的生命周期中,系统自动或者我们手动在容器中绑定一些类。比如:

protected $bind = [
        'middleware'              => Middleware::class,
        'request'                 => Request::class,
    ];



这样做之后,我们可以这样使用:

app('request')->rootDomain();



或者在控制器中这样使用(依赖注入):


namespace app\index\controller;

use think\Request;

class Index
{
    public function index(Request $request)
    {
        return $request->baseUrl();
    }
}



问题:我发现即使不绑定容器,同样也能够使用依赖注入。这是为什么?那绑定还有什么用,只是为了可以像这样使用吗app('request')->rootDomain()?

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-07-25 15:27
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    解答: 在tp6中,即使不手动绑定类到容器中,系统也会自动将一些类绑定到容器中,从而实现依赖注入。主要原因是tp6采用了容器自动绑定的机制,当系统需要实例化某个类时,会自动检测该类的构造函数参数,并尝试从容器中解析这些参数,从而实现依赖注入。 如果我们手动绑定类到容器中,可以提供更灵活的控制和定制。比如可以为类指定别名,方便在代码中引用;可以设置类的作用域,单例模式或每次创建一个新实例;可以绑定接口和实现类之间的关系,实现接口注入等。 所以,绑定容器的主要作用不仅仅是为了可以像这样使用 `app('request')->rootDomain()`,而是为了提供更多的灵活性和控制,以及更好地实现依赖注入。 案例:
    // 不绑定容器,仍然可以使用依赖注入
    namespace app\index\controller;
    use think\Request;
    class Index{
        public function index(Request $request){
            return $request->baseUrl();
        }
    }
    
    // 手动绑定容器
    // config/service.php
    protected $bind = [
        'middleware' => Middleware::class,
        'request' => Request::class,
    ];
    // 使用绑定的类
    app('request')->rootDomain();
    
    评论

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵