格式化
//格式化
$fmt=new MessageFormatter("zh_CN","{0,number,integer}只猴子在{1,number,integer}颗树上,每只树上有{2,number}只猴子");
echo$fmt->format([4560,123,4560/123]),PHP_EOL;
//4,560只猴子在123颗树上,每只树上有37.073只猴子
$fmt=new MessageFormatter("de","{0,number,integer}Affen auf{1,number,integer}B?umen sind{2,number}Affen pro Baum");
echo$fmt->format([4560,123,4560/123]),PHP_EOL;
//4.560 Affen auf 123 B?umen sind 37,073 Affen pro Baum
echo MessageFormatter::formatMessage("zh_CN","{0,number,integer}只猴子在{1,number,integer}颗树上,每只树上有{2,number}只猴子",[4560,123,4560/123]),PHP_EOL;
//4,560只猴子在123颗树上,每只树上有37.073只猴子
echo MessageFormatter::formatMessage("de","{0,number,integer}Affen auf{1,number,integer}B?umen sind{2,number}Affen pro Baum",[4560,123,4560/123]),PHP_EOL;
//4.560 Affen auf 123 B?umen sind 37,073 Affen pro Baum
看到了吗?类似于PDO里预编译操作的占位符。在调用format()方法后,就可以让这个方法里面的参数来替换占位符的内容。我们可以指定占位的所使用的参数类型和位置,{参数下标,类型,扩展类型}这就是这个信息数据格式化的占位符的规则定义。
看起来貌似很简单呀,不过需要注意的是,它只支持数字、日期、文本片段类型。
MessageFormatter::formatMessage()这个静态方法可以一次性指定语言、预操作语句,以及替换参数,无需先实例化,然后调用format()方法。
反格式化(根据规则获取参数数组)
通过使用实例化后的parse()方法或直接使用静态方法MessageFormatter::parseMessage()能实现这种操作。
值得注意的是,对于zh_CN,也就是中文语言区,这个操作是有问题的。你可以通过getErrorMessage()和getErrorCode()查看错误信息和错误代码,可以看到,对于中文,直接返回的错误信息就是解析失败。