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相关文章!



