php 的 yaml 解析(parse)函数,深度解读
发布于 作者:苏南大叔 来源:程序如此灵动~苏南大叔在上一篇文章中,对php
的yaml
的parse
函数,进行了初步解读,链接参见文末链接。我们可以知道:php
的对yaml
的parse
函数,有四个参数,而我们只是解读试用了第一个参数。
本文测试环境:centos
/php72
。
三个参数
在本篇文章中,苏南大叔将对后面三个参数进行解读。由于三个parse
函数(yaml_parse_file
,yaml_parse_url
,yaml_parse
)的参数都比较类似,这里苏南大叔以最基础的yaml_parse
函数为例,展开阐述本篇文章的详细内容。
mixed yaml_parse ( string $input [, int $pos = 0 [, int &$ndocs [, array $callbacks = null ]]] )
第一个参数 $input
$input是yml的字符串,这里就不用详细说明了。
第二个参数 $pos
官方说明是这样的:Document to extract from stream (-1 for all documents, 0 for first document, ...)。苏南大叔实验了一下,这个参数是有关yml文档格式的。我们采用下面的文档格式,来说明这个参数。字符串的写法,我们采用了<<<
这种定界符写法。
$yaml = <<<YAML
---
- event1:
name: My Event
date: 2017-11-12
---
- event2:
name: My Event 2
date: 2017-11-18
YAML;
$data = yaml_parse($yaml);
$data1 = yaml_parse($yaml, -1);
$data2 = yaml_parse($yaml, 0);
$data3 = yaml_parse($yaml, 1);
$data4 = yaml_parse($yaml, 2);
var_dump($data);
var_dump($data1);
var_dump($data2);
var_dump($data3);
var_dump($data4);
返回值如下:
array(1) {
[0]=>
array(3) {
["event1"]=>
NULL
["name"]=>
string(8) "My Event"
["date"]=>
string(10) "2017-11-12"
}
}
array(2) {
[0]=>
array(1) {
[0]=>
array(3) {
["event1"]=>
NULL
["name"]=>
string(8) "My Event"
["date"]=>
string(10) "2017-11-12"
}
}
[1]=>
array(1) {
[0]=>
array(3) {
["event2"]=>
NULL
["name"]=>
string(10) "My Event 2"
["date"]=>
string(10) "2017-11-18"
}
}
}
array(1) {
[0]=>
array(3) {
["event1"]=>
NULL
["name"]=>
string(8) "My Event"
["date"]=>
string(10) "2017-11-12"
}
}
array(1) {
[0]=>
array(3) {
["event2"]=>
NULL
["name"]=>
string(10) "My Event 2"
["date"]=>
string(10) "2017-11-18"
}
}
bool(false)
所以,这个参数描述的是yml文档里面的"---",大家感受一下。默认值是0,就是说,如果yml里面存在着多个"---"的话,那么只解析第一个“---”的内容,这个参数默认值的设定,苏南大叔认为不妥,默认应该解析全部(默认-1)才对。您说呢?
第三个参数 $ndocs
官方的说明是:If ndocs is provided, then it is filled with the number of documents found in stream。这个参数采用了 hacklang
对 php
极为诟病的引用类型。凭空创造了一个变量,并对其进行了赋值。当然了,这在php的世界里面是比较常见的事情了。
我们再看看这个新的例子:
$yaml = <<<YAML
---
- event1:
name: My Event
date: 2017-11-12
---
- event2:
name: My Event 2
date: 2017-11-18
YAML;
yaml_parse($yaml, -1, $ndoc);
yaml_parse($yaml, 0, $ndoc1);
yaml_parse($yaml, 1, $ndoc2);
yaml_parse($yaml, 2, $ndoc3);
var_dump($ndoc);
var_dump($ndoc1);
var_dump($ndoc2);
var_dump($ndoc3);
我们得到的值是:
int(2)
int(1)
int(2)
int(2)
所以,关于这个参数,苏南大叔的解读是:无论最终的处理结果如何,在处理的过程中,yaml_parse所经历的yml格式中的“---”的数量。
第四个参数 $callbacks
官方说明是:Content handlers for YAML nodes. Associative array of YAML tag => callable mappings. See parse callbacks for more details.
这个callback有些匪夷所思的节奏,首先,我们需要明确一点,我们写的是php,而不是node,所以这个callback的用法肯定和node是不一样的。php官方,有专门对这个callback参数的说明文档,见这里:http://doc.php.sh/zh/yaml.callbacks.parse.html 。
我们看一下下面的例子。
function _yaml_date($value, $tag, $flags) {
return new DateTime($value);
}
$yaml = <<<YAML
event1:
name: My Event
date: !date 2017-11-22
diy: !sunan awesome
YAML;
$data = yaml_parse($yaml);
print_r($data);
$data2 = yaml_parse($yaml, -1, $ndocs, array('!date' => '_yaml_date'));
print_r($data2);
function _yaml_sunan($value, $tag, $flags) {
//var_dump(func_get_args());
return "hi," . $value . "," . $tag . "," . $flags;
}
$data3 = yaml_parse($yaml, -1, $ndocs, array('!date' => '_yaml_date', '!sunan' => '_yaml_sunan',));
print_r($data3);
我们得到的返回值是这样的:
Array
(
[event1] => Array
(
[name] => My Event
[date] => 2017-11-22
[diy] => awesome
)
)
Array
(
[0] => Array
(
[event1] => Array
(
[name] => My Event
[date] => DateTime Object
(
[date] => 2017-11-22 00:00:00.000000
[timezone_type] => 3
[timezone] => PRC
)
[diy] => awesome
)
)
)
Array
(
[0] => Array
(
[event1] => Array
(
[name] => My Event
[date] => DateTime Object
(
[date] => 2017-11-22 00:00:00.000000
[timezone_type] => 3
[timezone] => PRC
)
[diy] => hi,awesome,!sunan,1
)
)
)
我们从这个例子里面,我们可以看到:
$callback
是个数组,定义了在yml中碰到某种以!开头的“类型”时,该如何处理。至于callback
函数里面的最后一个参数$flag
,苏南大叔暂时没有看出来是什么意思,似乎恒定为1
。官方也没有对其进行说明。大家如果有知道的,可以留言告诉我哦。谢谢~- 对于
yml
里面的以!
开头的“类型”,如果不指定callback处理函数的话,那么将会被直接忽略。
关联文章
总结
yml的格式,空格
、-
、---
都是有特殊含义的,所以不能随便删除。关于yml的更多解读,欢迎查看苏南大叔的更多文章:https://newsn.net/tag/yml/ 。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。