YAML在PHP中进行YAML操作扩展,说实话,我用的不多。在学习自动化测试的时候接触到使用这个配置文件来配置TravisCI的持续集成运行。当然那时候也是以学习为主。虽然我接触的不多,但是我也知道现在这种配置格式的写法基本已经成为主流。所以具体YAML相关的内容这里就不多解释了,不太了解的同学可以自行参考一些相关文档。今天我们要学习的主要是一个PHP解析转换YAML格式的扩展。安装过程没有什么特别需要说明的,和其他扩展一样安装即可。但是这个扩展需要一个libyaml-devel,不能在CentOS中通过yum或者dnf直接安装。我们可以在文末链接中找到下载地址。PHP数据转YAMLPHP数据转YAML,其实类似于JSON相关的操作,将一个数组转成YAML格式的字符串。$addr=array("given"=>"Chris","family"=>"Dumars","address"=>array("lines"=>"458WalkmanDr.Suite#292","city"=>"RoyalOak","state"=>"MI","postal"=>48046,),);$invoice=array("invoice"=>34843,"date"=>980208000,"bill-to"=>$addr,"ship-to"=>$addr,"product"=>array(array("sku"=>"BL394D","quantity"=>4,"description"=>"篮球","price"=>450,),array("sku"=>"BL4438H","quantity"=>1,"description"=>"SuperHoop","price"=>2392,),),"tax"=>251.42,"total"=>4443.52,"comments"=>"下午晚些时候最好。备用联系人是NancyBillsmer@338-4338。",);$yamlString=yaml_emit($invoice);var_dump($yamlString);//string(624)"---//发票:34843//日期:980208000//bill-to://given:Chris//family:Dumars//address://lines:|-//458WalkmanDr.//Suite#292//city:RoyalOak//state:MI//邮政:48046//送货地址://给定:Chris//家庭:Dumars//地址://线路:|-//458WalkmanDr.//Suite#292//城市:皇家橡树//州:MI//邮政:48046//产品://-sku:BL394D//数量:4//描述:"\u7BEE\u7403"//价格:450//-sku:BL4438H//数量:1//描述:SuperHoop//价格:2392//税费:251.42//总计:4443.52//评论:下午晚些时候最好。备用联系人是NancyBillsmer@338-4338.//...//"你可以看到yaml_emit()函数转换的结果是一个非常标准的YAML格式,开头有---,结尾有....但是你会发现很多教程或者framework里面的.yml文件是没有这些符号的,从官方文档中获取可以知道这些符号都是按照推荐写的,和我们的extension是非常一致的推荐,就是转换的结果很标准,另外我们在测试代码中加入了中文内容,可以看到在直接转换的时候,中文被替换成了Encoded,就像JSON操作一样,在YAML的扩展功能,我们也可以指定编码格式来原样显示中文。var_dump(yaml_emit($invoice,YAML_UTF8_ENCODING));//string(616)"---//………………//描述:篮球//………………//...//"是true将YAML转为PHP数组,也类似JSON操作,将YAML格式的字符串格式内容反转回PHP数据内容。var_dump(yaml_parse($yamlString));//array(8){//["invoice"]=>//int(34843)//["date"]=>//int(980208000)//["bill-to"]=>//array(3){//["given"]=>//string(5)"Chris"//["family"]=>//string(6)"Dumars"//………………//………………同样是一个非常简单的yaml_parse()函数。除了直接操作字符串,我们还可以直接提取文件内容进行转换,包括上面的yaml_emit()函数,也是直接将结果写入文件。var_dump(yaml_parse_file('styleci.yml'));//array(3){//["php"]=>//array(3){//["preset"]=>//string(7)"laravel"//["disabled"]=>//array(1){//[0]=>//string(10)"unused_use"//}//["finder"]=>//array(1){//["not-name"]=>//数组(2){//[0]=>//字符串(9)"index.php"//[1]=>//字符串(10)"server.php"//}//}//}//["js"]=>//array(1){//["finder"]=>//array(1){//["not-name"]=>//array(1){//[0]=>//string(14)"webpack.mix.js"//}//}//}//["css"]=>//bool(true)//}我们测试的文件是Laravel自带的.styleci.yml文件。我们不需要在Laravel框架中安装此YAML扩展。好像框架本身有读取和转换这种YAML格式的工具,这个我们最后再说。与yaml_parse_file()类似,yaml_emit_file()将PHP数据转换为YAML格式并直接写入文件。你可以自己测试一下。回调函数处理标签,无论是yaml_emit()还是yaml_parse(),都支持回调参数操作。我们先来看一个例子。//php://preset:!laravellaravel//disabled://………………//…………functioncallback($value){returnstr_replace('laravel','newversionlaravel8',$值);}$ndocs=0;var_dump(yaml_parse_file('styleci.yml',0,$ndocs,['!laravel'=>'callback']));//array(3){//["php"]=>//array(3){//["preset"]=>//string(20)"newversionlaravel8"//["disabled"]=>//array(1){//……………………//……………………什么意思?!laravel可以看作是YAML中的一种标签格式。而这个回调的作用就是遇到类似这种类型的标签使用什么回调函数。比如我们原文档中!laravel后面的内容就是laravel。在回调函数中,我们将内容替换为newversionlaravel8,所以最终输出的结果是preset字段的内容变成了newversionlaravel8。当然,更详细的内容和更多的语法还是需要我们对YAML格式的语法有深入的了解才能更加清晰,这里就不多说了,毕竟接触不多.总结这个扩展的内容不多,即使在真实的业务环境中需要操作YAML格式的配置文件,我估计也不会用。为什么?当然,因为Composer中已经有很多YAML处理组件可供我们使用。完全不需要通过扩展编译安装的方式改变服务器上的PHP环境。如果你自己使用,你可以在packagist.org中找到很多组件,而如果你使用Laravel,它的底层实际上是symfony框架中的yaml处理组件。你可以直接使用composerrequiresymfony/yaml将这个组件添加到你自己的小项目中。具体内容可以参考这个文档:https://symfony.com/doc/current/components/yaml.html测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/01/来源/10。了解PHP中YAML操作扩展的使用。php参考文档:https://www.php.net/manual/zh/book.yaml.phphttp://www.rpmfind.net/linux/rpm2html/search.php?query=libyaml-devel(x86-64))http://bd808.com/pecl-file_formats-yaml/
