我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

苏南大叔在上一篇文章中,对phpyamlparse函数,进行了初步解读,链接参见文末链接。我们可以知道:php的对yamlparse函数,有四个参数,而我们只是解读试用了第一个参数。

苏南大叔:php 的 yaml 解析(parse)函数,深度解读 - yaml_parse
php 的 yaml 解析(parse)函数,深度解读(图1-1)

本文测试环境: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。这个参数采用了 hacklangphp 极为诟病的引用类型。凭空创造了一个变量,并对其进行了赋值。当然了,这在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/

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php    yaml