乐趣区

关于php:Tp5框架源码分析第二步配置文件详解

配置文件品种

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。

退出移动版