不能。Laravel 的 Config 类(Illuminate\Config\Repository)未实现 ArrayAccess 接口,故不支持 $config['key'] 直接访问;其配置读取必须通过 get() 方法以保障默认值、点号嵌套、环境覆盖等核心逻辑,若需数组语法,须自行封装代理类并严格限制只读。

PHP ArrayAccess 接口到底能不能直接用于 Laravel 配置类?
不能。Laravel 的 Config 类(Illuminate\Config\Repository)本身没有实现 ArrayAccess 接口,所以你不能像 $config['database.default'] 这样直接用方括号访问——会抛出 Fatal error: Uncaught Error: Cannot use object of type Illuminate\Config\Repository as array。
这不是 Laravel 忘了加,而是有意为之:配置读取需走 get() 方法,支持默认值、点号嵌套、环境覆盖等逻辑,直接数组访问无法承载这些语义。
想用 $config['key'] 语法?必须自己封装一层
要获得类似数组的访问体验,得写个代理类,让它实现 ArrayAccess,内部委托给 Laravel 原生 Config 实例:
class ConfigArrayAccess implements \ArrayAccess
{
protected $config;
public function __construct($config)
{
$this->config = $config; // 传入 app('config') 或 Config::getInstance()
}
public function offsetExists($key): bool
{
return $this->config->has($key);
}
public function offsetGet($key): mixed
{
return $this->config->get($key);
}
public function offsetSet($key, $value): void
{
throw new \LogicException('Config is read-only via ArrayAccess');
}
public function offsetUnset($key): void
{
throw new \LogicException('Config is read-only via ArrayAccess');
}
}
使用时:$arrConfig = new ConfigArrayAccess(app('config'));echo $arrConfig['app.name']; // ✅
- 注意:只允许读,
offsetSet和offsetUnset必须拒绝写入,否则会绕过 Laravel 的配置合并机制,导致环境变量、服务提供者注册等逻辑失效 - 不要在
offsetGet里硬编码默认值(比如?? 'default'),应保持和config()->get('key', $default)行为一致,否则丢失默认值能力
Laravel 10+ 中 config() 辅助函数返回的是 Repository,不是数组
很多人误以为 config('database.default') 返回数组,其实它返回的是 Repository 实例;而 config() 不带参数调用时,返回的是整个配置数组的快照副本(即 array_merge_recursive 后的结果),但这个数组是静态的,后续 Config::set() 不会影响它。
立即学习“PHP免费学习笔记(深入)”;
所以:
-
config()['database.default']是合法的,但只是读取快照,不响应运行时变更 -
app('config')['database.default']直接报错,因为Repository没实现ArrayAccess - 若你依赖动态配置(如中间件中根据请求切换 config),必须用
config()->get(),不能依赖快照数组
别为了“魔法”牺牲可维护性
用 ArrayAccess 封装配置看似简洁,但在大型项目里容易埋坑:
- IDE 无法推导键名(没类型提示),
$config['mail.from.address']写错了也不会报错,直到运行时 - 调试时看不出是原生 config 还是代理对象,堆栈里多一层间接调用
- 团队新人看到
[]语法,可能误以为可以$config['new.key'] = 'val',实际会炸
真正值得花力气的,是配合 PHPStan 或 Laravel Pint 建立配置键名的常量定义或枚举,而不是把访问方式“魔法化”。



















