thinkphp6.0容器初始化时自动完成绑定:先设静态实例,再存app对象到instances,最后加载app/provider.php写入bind映射;手动绑定分三类——类标识、闭包、已有实例;绑定后通过get/make触发实例化并缓存。

容器初始化时自动完成的绑定
ThinkPHP6.0在执行new App()时,构造函数会立即触发一系列绑定动作,这是整个容器绑定流程的起点。
第一步:调用static::setInstance($this),将当前App实例写入Container类的静态属性$instance,这一步是后续所有getInstance()调用能拿到唯一实例的前提。
第二步:执行$this->instance('app', $this),把App实例存进$instances数组,键名为app;紧接着执行$this->instance('think\Container', $this),再存一次,键名为think\Container——这两个键名会在后续通过get()或make()直接取出App对象。
第三步:检查app/provider.php文件是否存在,若存在则include并传给$this->bind()方法。该文件默认返回类似['think\Request' => Request::class, 'think\exception\Handle' => ExceptionHandle::class]的映射数组,这些键值对会被写入容器的$bind属性中,用于后续类的自动解析与实例化。
【注意:provider.php必须放在app目录下,且文件名不能拼错,否则绑定不会发生】
手动绑定的三种常用方式
除自动加载外,开发者可在运行时随时向容器注入新绑定,三类操作对应不同场景。
方法一:绑定类标识(推荐用于服务类、模型、工具类)
使用$app->bind('cache', 'app\common\Cache')或助手函数bind('cache', 'app\common\Cache')。此后调用app('cache')即可获取app\common\Cache的新实例(单例需额外参数控制)。
方法二:绑定闭包(适合带初始化逻辑的轻量服务)
例如bind('sayHello', function($name) { return 'Hello, ' . $name; });,调用app('sayHello', ['World'])时,闭包会接收参数并执行。
方法三:绑定已有实例(避免重复构造,适用于全局共享对象)
先$db = new PDO(...),再bind('pdo', $db)。此时app('pdo')返回的是同一对象引用,【不可再对$bind数组赋值,实例只存于$instances中】。
绑定后如何被实际使用
容器绑定本身不触发实例化,真正激活绑定关系的是get()或make()调用,其内部执行路径如下:
① 调用$app->get('cache') → ② 先查$instances['cache']是否存在,有则直接返回 → ③ 无则查$bind['cache'] → ④ 若值为类名字符串,用反射创建新实例并缓存到$instances → ⑤ 若值为闭包,则执行闭包并缓存返回值。
控制器构造方法中声明public function __construct(Cache $cache),框架会自动调用make(Cache::class)完成依赖注入——这背后完全依赖前述绑定结果。若Cache未被绑定,且不存在自动映射规则,将抛出ClassNotFoundException。
路由闭包、中间件、事件监听器等所有支持依赖注入的上下文,均走同一条make → bind → instances查找链。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











