当前位置: 首页 > 后端技术 > PHP

Tp5框架源码分析第二步--------配置文件详解

时间:2023-03-29 18:57:01 PHP

配置文件类型1.常规配置核心框架内置的配置文件(thinkphp/convention.php)做不需要更改2.每次都进行应用配置一个应用的全局配置文件(项目根目录下config目录下的文件)。3、模块配置(1)各个模块的配置文件(相同的配置参数会覆盖应用配置),有的配置参数modules是无效的,因为(2)如indexmodule="index/config/database.php4.动态配置主要是指在controllers或者behaviors中(动态)改变配置,这种配置方式只对当前请求有效,因为不会Savetoconfiguration,不推荐这种配置,其中module配置优先高于应用配置,底层的PHPArrayAccess类巧妙的使用了分析offsetExists来判断偏移量是否存在offsetGet获取一个偏移量的值offsetSet设置一个偏移量的值offsetUnset删除一个偏移量的值当我们使用ArrayAccess,必须要实现上面的四个方法,接下来我们来做一个简单的实战:首先,我们在扩展目录,然后让这个类实现ArrayAccess接口。但是我们在实现这个接口的时候,必须要实现上面的四个方法,否则这个接口是无法实现的。然后我们在index.php控制器中调用它,构建一个obj方法,然后在其中调用ObjArray类。当我们直接打印title键的时候,你会发现它执行了offsetGet方法,因为在ObjArray中已经定义了title的值。重定义一个属性后,会先执行offsetSet方法,再执行offsetGet方法。需要先在ObjArray中创建一个属性,然后获取该属性。config核心类库1.加载配置文件:load()----loadFile():(1)phpyaml格式文件处理(2)parse处理,分为不同的文件类型:inijsonxml和设计模式----工厂模式(三)set2.set3.get4.ArrayAccess:offsetExistsoffsetGetoffsetSetoffsetUnsetconfig中有很多属性和方法,这里就不一一介绍了,大家可以打开config文件看看。接下来说说加载配置文件load(),load方法什么时候执行,我一一说明。在入口文件中执行run()方法,然后在run方法中初始化init()。在init中,它为已注册的服务加载初始化文件、行为扩展文件、公共文件、中间件和容器对象实例。并读取配置文件,当读取配置文件时,会调用load()。load方法中的$file是传入的文件,$name是文件的前缀。A:判断$file是否是文件,如果是文件,赋值给$filename,如果不是,执行B。B:给$file加上前缀和后缀,然后判断是否是文件,然后赋值到$文件名。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()解析方法的逻辑如下。首先判断$type是否为空。如果为空,则将$config的后缀赋值给$type。然后执行Loader中的工厂方法,是工厂模式,传入的命名空间是think\config\driver,那么会位于thinkpgp\library\think\config\driver目录下,对应ini,json和xml文件。然后我们看工厂方法A:它执行的是三元运算。如果$name存在\\,则返回$name,否则将$name首字母大写,加在namespace后面。最后返回的是think\config\driver\Ini;B:判断$name这个类是否存在,不存在则抛异常,即C,存在则进入Container容器处理,调用incoleClass方法。最后返回的是类的一个实例。接下来,我们将解释集合。在说set之前,先说说Ini。它在这里处理配置文件,最后返回一个数组,一个配置信息的数组。set()set方法传入一个数组$name,所以不执行第一步,直接执行第二步判断是否为数组。然后判断$value是否为空,传入一个文件,然后执行下一步,判断config[$value]是否为空,第一次执行时为空。然后将$name赋给$value,填入config[$value]。当config[value]存在时,去掉config和$name的重复项,然后将value赋值给$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。