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

就像json_encodejson_decode成对出现一样,配合yaml_parse出现的函数就是yaml_emitphp下的yml生成相关的emit函数,有2个,分别是yaml_emit()yaml_emit_file()。本篇文章中,苏南大叔以yaml_emit()函数为例,来对这2个函数进行最简单说明。

苏南大叔:php的yaml生成(emit)函数,深度解读 - php-yaml-emit
php的yaml生成(emit)函数,深度解读(图4-1)

本文测试环境:centos/php72

基本描述

string yaml_emit ( mixed $data [, int $encoding = YAML_ANY_ENCODING [, int $linebreak = YAML_ANY_BREAK [, array $callbacks = null ]]] )
bool yaml_emit_file ( string $filename , mixed $data [, int $encoding = YAML_ANY_ENCODING [, int $linebreak = YAML_ANY_BREAK [, array $callbacks = null ]]] )

基本上来说,yaml_emit_file = yaml_emit + file_put_contents。所以,我们就仅仅说明yaml_emit了。

参数 $encoding

官方说明,取值有:

  • YAML_ANY_ENCODING
  • YAML_UTF8_ENCODING
  • YAML_UTF16LE_ENCODING
  • YAML_UTF16BE_ENCODING

苏南大叔的建议取值是YAML_UTF8_ENCODING,因为这个取值的话,传递进去的中文,出来的时候还是中文。你懂的。然而,默认值不是这个值,而是YAML_ANY_ENCODING

$obj = array(
    "slogan" => "i am 苏南"
);
var_dump(yaml_emit($obj));
var_dump(yaml_emit($obj, YAML_UTF8_ENCODING));

结果如下:

苏南大叔:php的yaml生成(emit)函数,深度解读 - 002
php的yaml生成(emit)函数,深度解读(图4-2)

参数 $linebreak

官方取值有:YAML_ANY_BREAK, YAML_CR_BREAK, YAML_LN_BREAK, YAML_CRLN_BREAK。

主要就是生成的字符串的回车换行问题,linux和win下面不同,这是老生常谈的问题了。大家仁者见仁智者见智,自行选择一个好了。苏南大叔就不做推荐了。

$obj = array(
    "slogan" => "i am 苏南",
    "awesome" => "wonderful"
);
var_dump(yaml_emit($obj, YAML_UTF8_ENCODING));
var_dump(yaml_emit($obj, YAML_UTF8_ENCODING, YAML_CR_BREAK));
var_dump(yaml_emit($obj, YAML_UTF8_ENCODING, YAML_LN_BREAK));
var_dump(yaml_emit($obj, YAML_UTF8_ENCODING, YAML_CRLN_BREAK));

苏南大叔:php的yaml生成(emit)函数,深度解读 - 003
php的yaml生成(emit)函数,深度解读(图4-3)

参数$callbacks

官方的独立文章说明:http://doc.php.sh/zh/yaml.callbacks.emit.html 。苏南大叔的解读就是:对于自定义的类,格式化后再输出。下面的例子中,这个自定义的类叫做EmitDemo,调用的callback是EmitDemo类的方法:yamlEmit。生成的tag!demo/emit

$obj = array(
    "slogan" => "i am 苏南"
);
class EmitDemo {
    public $data;
    public function __construct($d) {
        $this->data = $d;
    }
    public static function yamlEmit(EmitDemo $obj) {
        return array(
            'tag' => '!demo/emit',
            'data' => $obj->data,
        );
    }
}
$obj2 = [new EmitDemo(array('a', 'b', 'c')), $obj];
var_dump(yaml_emit($obj2, YAML_UTF8_ENCODING, YAML_CRLN_BREAK));
var_dump(yaml_emit($obj2, YAML_UTF8_ENCODING, YAML_CRLN_BREAK, ['EmitDemo' => array('EmitDemo', 'yamlEmit')]));

我们得到的结果如下:

苏南大叔:php的yaml生成(emit)函数,深度解读 - 004
php的yaml生成(emit)函数,深度解读(图4-4)

这里,对于自定义类,如果我们没有设置callback的话,那么,执行的是serialize序列化。而对于设置了callback的,我们则执行的是自定义规则。

结语

yaml_emit_file是在yaml_emit基础之上,增加了个文件路径。值得注意的就是:文件路径如果有不存在的文件夹的时候,就会生成失败。所以需要 mkdir($structure, 0, true) 这个php函数来进行配合。

感谢您的阅读,欢迎关注苏南大叔的yml相关文章!

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

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

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

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