bound() 方法通过检查 $bindings 数组中是否存在指定抽象键来判断是否显式绑定,仅反映是否调用过 bind()/singleton()/instance(),不保证能成功解析。

在 Laravel 6 中,服务容器判断某个抽象类型(如接口名、类名或字符串标识)是否已**显式绑定**,核心依据是检查内部属性 $bindings 数组中是否存在该抽象键。
看 $bindings 数组有没有这个 key
容器的 bound() 方法是官方提供的判断入口:
- 它直接检查
$this->bindings[$abstract]是否存在且不为null - 注意:这仅反映“是否调用过
bind()/singleton()/instance()”,不表示能成功解析 - 即使没显式绑定,只要类存在且无依赖或依赖可自动解析,
make()仍可能成功 —— 但这属于“自动解析”,不算“已绑定”
bound() 和 resolved() 是两回事
bound() 只管注册动作,resolved() 才管实例是否已生成:
-
$app->bound('logger')→ 返回true当你执行过$app->bind('logger', ...) -
$app->resolved('logger')→ 返回true仅当该抽象已被make()过且完成构造(对singleton尤其关键) - 未绑定但能自动解析的类(如普通控制器),
bound()返回false,resolved()初始也为false
别被别名或上下文干扰判断
容器还维护 $aliases 和 $contextual,但它们不影响 bound() 结果:
- 别名(如
'db' => DatabaseManager::class)本身不是绑定,bound('db')是false;要查原抽象名 - 上下文绑定(
when(...)->needs(...)->give(...))不向$bindings写入主键,bound(Interface::class)仍为false,除非你同时做了主绑定
实际检查建议
调试时优先用这两个方法组合验证:
- 先
var_dump($app->bound(MyService::class))确认是否注册 - 再
var_dump($app->resolved(MyService::class))看是否已实例化 - 最后
try { $app->make(MyService::class); } catch (...) { ... }验证能否真正解析(含依赖是否就绪)


















