在ThinkPHP中[1],一般来说应用的配置文件是自动加载的, 加载的顺序是:
惯例配置->应用配置->扩展配置->场景配置->模块配置->动态配置
0x01 配置介绍
- 惯例配置
位于thinkphp/convention.php
, 相当于系统的默认配置
- 应用配置
默认位于application/config.php
,应用初始化时首先加载的公共配置文件,每个应用初始化的配置,这个是个文件夹,文件可对应convention
中的一部分
- 模块配置
对应每个模块的配置文件
- 动态配置
RT
0x02 ArrayAccess
ArrayAccess提供像访问数组一样的方式访问对象的接口
接口
1 | ArrayAccess { |
实现
1 |
|
调用
1 | public function obj() { |
0x3 流程分析
- 配置文件
通常是php,yaml格式需要安装扩展,tp还提供了一些其他格式(ini,json,xml)以驱动的方式通过工厂模式parse
- 方法
- set: 设置配置
- get: 获得配置
加载
系统从应用程序入口run()
方法来到框架中的initialize()
(.php -> .php),这里会调用初始化方法init()
。init()
中有自动读取配置文件模块。
自动读取配置文件代码段
1 | // 自动读取配置文件 |
这里加载配置文件会使用load()
方法
1 | # 拿到文件路径和文件前缀(ex. ../cache.php, cache) |
这里会判断是否使用了Yaconf
扩展[2],如果使用了有一个标量可以判断然后进入这个块。然鹅我并没有用过这个。
看加载文件的loadFile()
1 | protected function loadFile($file, $name) |
这里区分加载了上边说的三类配置文件类型,直接加载的.php
文件,需要扩展的.yaml
文件以及用工厂模式加载的那三类(ini,json,xml)
。这个parse
感兴趣的可以走走,跑路了:>。
set
加载了文件,还需要set
方法来设置配置
如在加载loadFile()
中加载应用配置的时候, 调用是 return $this->set(include $file, $name);
而set
方法接收是public function set($name, $value = null)
就感觉很怪,可能我还没能理解意图。如传入app.php
这个应用配置,$name
是配置数组,而$value
是文件名前缀。接下来如果是数组就进入批量设置,然后如果有$this->config
就array_merge
没有就创建一个。然后赋上$name
,对$name
是内容,$value
应该是做key来用,代码我就不贴了哈。