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

就向json_encode和json_decode成对出现一样,配合yaml_parse出现的函数就是yaml_emit。php中yml的emit函数,有2个,分别是yaml_emit和yaml_emit_file。本篇文章中,苏南大叔以yaml_emit函数为例,来对这2个函数进行最简单说明。

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

参数 $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

参数$callbacks

官方的独立文章说明:https://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

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

结语

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

感谢您的阅读,欢迎关注苏南大叔的yml相关文章! https://newsn.net/tag/yml/

本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。