配置文件种类
1.惯例配置 核心框架内置的配置文件(thinkphp/convention.php),无需更改
2.应用配置 每个应用的全局配置文件(项目根目录下的config目录下的文件).
3.模块配置 (1)每个模块的配置文件(相同的配置参数会覆盖应用配置),有部分配置参数模块 是无效的,因为已(2)比如index模块=》 index/config/database.php
4.动态配置 主要指在控制器或行为中进行(动态)更改配置,该配置方式只在当次请求有效,因 为不会保存到配置中去。这种配置建议少用。
其中模块配置优先级高于应用配置。
PHP底层ArrayAccess类巧用分析
offsetExists 检查偏移位置是否存在
offsetGet 获取一个偏移位置的值
offsetSet 设置一个偏移位置的值
offsetUnset 删除一个偏移位置的值
当我们使用ArrayAccess的时候我们必须去实现以上四个方法。
接下来我们来简单实战一下:
首先我们再extend目录下创建一个ObjArray的类文件,然后我们让这个类实现ArrayAccess接口。但是当我们实现这个接口的时候,我们就要把上面四个方法都要去实现了,不然是无法实现这个接口的。
然后我们在index.php控制器里进行调用,构建一个obj方法,然后在里面调用ObjArray类,当我们直接打印title的key的时候,你会发现它执行的是offsetGet方法,因为在ObjArray里面已经定义了title的值。当重新定义一个属性之后,会先执行offsetSet方法,然后执行offsetGet方法,这是需要先在ObjArray中先创建一个属性,然后再获取到这个属性。
Config核心类库
1.加载配置文件:load()----loadFile():(1)php yaml格式文件处理 (2)parse处理,又分为不同的文件类型:ini json xml 和设计模式----工厂模式 (3)set
2.set
3.get
4.ArrayAccess:offsetExists offsetGet offsetSet offsetUnset
config里面有很多属性和方法,这里就不一一介绍了,可以打开config文件去看一下。我们接下来从加载配置文件load()说,那什么时候会执行load方法呢,让我一一说明。
在入口文件里面执行的是run()方法,然后在run方法里面会进行初始化init(),在init中,它会加载初始化文件、行为扩展文件、公共文件、中间件,注册服务的容器对象实例和读取配置文件,在读取配置文件的时候,就会调用load()。
load方法中的$file是传入的文件,$name是文件的前缀。
A:判断$file是否是文件,如果是文件,把它赋值给$filename,如果不是,执行B。
B:把$file加上前缀和后缀,然后判断是否是文件,然后赋值给$filename.
C:判断文件$filename是否存在,存在的话,调用LoadFile();
D:如果$filename不存在,进行判断yaconf配置是否存在此文件,然后创建这个文件。
LoadFile($filename,$name)方法
首先转换大小写,然后提取文件后缀,接着进行判断是不是php文件,如果是的话,加载$file文件,然后返回set函数,include $file返回的是一个数组。
如果不是php文件,判断是不是yaml文件和yaml_parse_file方法是否存在,然后返回set函数,同样yaml_parse_file返回的也是一个数组。
关于yaml和set函数,在后面我会详细讲解。
如果yaml和php都不支持的话,就会走到parse,这个在上面加载配置文件的地方有解释。
parse()
parse方法的逻辑是这样的,首先判断$type是不是空,如果是空的话,把$config的后缀赋值给$type。然后执行Loader中的factory方法,这是一个工厂模式,它传入的命名空间是think\config\driver,那么它会定位到thinkpgp\library\think\config\driver目录下,它就对应到ini、json和xml文件。
然后我们看factory方法
A:进行的是一个三元运算,如果$name存在\\,就返回$name,否则就把$name进行首字母大写处理后添加namespace后面。最终返回的是think\config\driver\Ini;
B:判断$name 的类是否存在,如果不存在抛出异常,也就是C,如果存在进入Container容器进行处理,调用incoleClass方法。最终返回的是类的实例。
接下来我们要讲解一下set,在讲set之前,我们说一下Ini。
它这里是对配置文件进行处理,最后返回的是一个数组,配置信息的数组。
set()
set方法传入的是一个数组$name,所以就不进行第一步操作,直接进行第二步,判断是否是数组。
然后判断$value是否是空,它传入的是文件,然后执行下一步,判断config[$value]是否是空,当执行第一次的时候,它是空的。
然后把$name赋值给$value,然后把它填入到config[$value]中去。
当config[value]存在的时候,就把config中和$name重复的去掉,然后赋值给$result,放到内存里。
get()方法详解
首先判断$name是不是空,或者$name是不是带"."符号,然后把$this->prefix用"."把$name连接起来赋值给$name。$this->prefix的值是App就相当于$name = App.xxx。
接下来判断$name是不是空的,如果是空的就返回在set()方法里存入内存的config。
然后判断$name是不是App.,如果是的话,就把后面低点去掉,然后把app传到pull方法里面。
pull()方法
首先把$name转化为小写,然后判断有没有yaconf,有的话就进行getYaconfName处理$name,然后判断Yaconf中是否存在$yaconfName,存在就进行get处理后赋值给$config,最后进行三元运算,判断是否存在config[$name],存在就把它和$config去重合并,不存在就返回$config,然后判断返回的是否存在。最后返回判断$this->config[$name]是否存在的运算。
在get方法后面的逻辑,如果上面的逻辑不走的话,$name传入是cache,那么此时$name为APP.cache。判断yaconf是否存在,存在就返回Yaconf数据,然后判断$yaconfName是否存在,如果存在就返回Yaconf的配置。最后对$name分隔变成数组,把$name[0]转化为小写。然后把$this->config赋值给$config。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。