php的yaml生成(emit)函数,深度解读
发布于 作者:苏南大叔 来源:程序如此灵动~就像json_encode
和json_decode
成对出现一样,配合yaml_parse
出现的函数就是yaml_emit
。php
下的yml
生成相关的emit
函数,有2个,分别是yaml_emit()
和yaml_emit_file()
。本篇文章中,苏南大叔以yaml_emit()
函数为例,来对这2个函数进行最简单说明。
本文测试环境: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));
结果如下:
参数 $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));
参数$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')]));
我们得到的结果如下:
这里,对于自定义类,如果我们没有设置callback的话,那么,执行的是serialize序列化。而对于设置了callback的,我们则执行的是自定义规则。
结语
yaml_emit_file是在yaml_emit基础之上,增加了个文件路径。值得注意的就是:文件路径如果有不存在的文件夹的时候,就会生成失败。所以需要 mkdir($structure, 0, true)
这个php函数来进行配合。
感谢您的阅读,欢迎关注苏南大叔的yml
相关文章!
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。