上一篇我们介绍了一个大家熟知的YAML格式配置文件的相关操作。今天再学习一个配置文件扩展名。这个配置文件的写法其实和php.ini的PHP标准配置格式差不多,但是有一些区别。但是内容很简单,大家仅供参考。Yaconf的配置文件和格式从Yaconf的名字是不是看出了什么端倪呢?没错,和yaf、yac一样,又是我们鸟哥的作品。不得不说大神还是为我们贡献了很多好作品。后面会讲到它小众的开源扩展,以后学习框架的时候再详细了解Yaf扩展。Yaconf的安装也是常用的扩展安装方式,但是需要PHP7以上的版本。另外,安装后需要在php.ini文件中指定yaconf.directory,也就是存放配置文件的目录。该属性不能通过ini_set()进行配置,即必须在程序运行前加载到PHP运行环境中。我们根据文档配置为/tmp/conf,然后在这个目录下创建我们需要的配置文件。Yaconf的语法非常简洁,而Bird的作品更注重性能,所以Yaconf也是一个高性能的配置管理扩展。Yaconf的具体介绍可以参考文末第二个链接的说明。下面我们就来看看它的一些语法和具体用法。foo="bar"phpversion=PHP_VERSIONenv=${HOME}arr.0=1arr.1=2arr[]=3arr[3]=4map.foo=barmap.bar=foomap.foo.name=yaconf看看有什么特点?首先,如果内容是双引号,它将把这个配置变量当作一个字符串。如果它不是双引号,它会尝试用PHP解析它。然后array、HashMap等写法也完美支持。好像比php.ini的写法强。但这还不是全部。[parent]parent="base"children="NULL"[children:parent]children="children"好吧,你没看错,它也可以支持这样的继承,方括号中标出的内容可以看作是一个配置Fragment,或者一段内容,具体作用我们后面会看到。这些是获取配置内容的配置语法。接下来我们具体看一下如何读取这些配置信息。这个扩展其实提供了两个功能,一个是读取,一个是查询配置是否存在。我们先来看看如何读取数据。var_dump(Yaconf::get("test.foo"));//string(3)"bar"var_dump(Yaconf::get("test.phpversion"));//string(5)"7.4.4"var_dump(Yaconf::get("test.env"));//string(5)"/root"这个功能相信不用解释了吧,test就是我们的文件名,在/tmp/conf/test.ini文件,我们在这个配置里面写了上面的测试配置信息。当然我们也可以在这个目录下定义更多的配置文件。例如,如果我们定义另一个配置文件foo.ini,那么我们可以这样读取它:var_dump(Yaconf::get("foo.SectionA.key"));//string(3)"val"为数组配置信息,直接获取的内容以数组形式返回。var_dump(Yaconf::get("test.arr"));//数组(4){//[0]=>//字符串(1)"1"//[1]=>//字符串(1)"2"//[2]=>//字符串(1)"3"//[3]=>//字符串(1)"4"//}var_dump(Yaconf::get("test.arr.1"));//string(1)"2"var_dump(Yaconf::get("test.map"));//array(2){//["foo"]=>//array(1){//["name"]=>//string(6)"yaconf"//}//["bar"]=>//string(3)"foo"//}var_dump(Yaconf::get("test.map.foo.name"));//string(6)当“yaconf”获取到数组里面的数据时,我们可以直接使用.获取序列的内容。最后就是上面提到的分片和继承的功能。var_dump(Yaconf::get("test.parent.parent"));//string(4)"base"var_dump(Yaconf::get("test.children.parent"));//string(4)"base"var_dump(Yaconf::get("test.parent.children"));//string(4)"NULL"var_dump(Yaconf::get("test.children.children"));//string(8)"children"test是文件名,parent是我们在方括号中定义的切片的名称,然后继续点击切片下定义的配置项名称,获取配置信息在切片下。继承的使用相信从代码中就可以看出。parent的parent配置项被children继承后,children可以直接获取parent中定义的配置项的内容,而无需定义该配置项。children配置项在children中被重写,所以children分片中的children配置项显示的是自己定义的内容。检测配置信息是否存在如前所述,此扩展中有两种方法。第二种方法用于检测配置项是否存在,非常简单。var_dump(Yaconf::has("test.foo"));//bool(true)var_dump(Yaconf::has("test.baz"));//bool(false)总结老实说,这个配置扩展也不是一个很常见的扩展应用。因为你现在使用的框架,不管是Laravel还是TP,都会有自己的一套配置文件格式和操作。当然,如果你是鸟哥的忠实粉丝或者你公司的系统是基于Yaf、Yac、Yar的,那么加入这个Yaconf也算是一套完整的高性能内扩架构。它们的主要特点是性能强大。毕竟是从底层C扩展的角度提供的框架,而不是通过Composer用PHP编写的框架。以后我们研究讲解框架的时候,可能会拿出来单独做一个系列!测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/01/source/11。了解在PHP中使用YaConf扩展。PHP参考文档:https://www.php.net/manual/en/book.yaconf.phphttps://www.laruence.com/2015/06/12/3051.html
