我知道PHP不支持无符号的64位整数。
但是我只需要通过PDO查询从MySQL表中读取无符号的64位整数值,并将它们传递给客户端(不进行任何计算或比较); PHP页面向客户端发布一个非常简单的REST接口,并且应该仅将查询结果作为JSON数据输出。
现在PDO查询返回未触及的整数,只要它们是63位宽(无符号),但是当表中的原始值设置了第64位时,PDO驱动程序将其转换为字符串(我已设置{ {1}}属性为false,因为我希望尽可能多地保留类型。)
当我调用PDO::ATTR_STRINGIFY_FETCHES
函数时,相关字段会得到相同的处理:当它们超过63位宽时,它们就成了字符串。
我不想把它们留在json输出中作为字符串,因为它需要"破坏"更改客户端代码以使它们在解码时处理json-string到ulong转换。
有没有办法以某种方式自定义json_encode行为,将它们输出为" UInt64" ?
我已经看过JsonSerializable,但它似乎无法解决我的问题。
答案 0 :(得分:1)
我找到了问题的解决方法,不完全“优雅”,但实用(并且有效)。
我在我的项目中包含了一个在GitHub here上找到的自定义纯PHP json编码库。
我已经宣布了这个界面:
interface JSONSerializer
{
public function toJSON();
}
我在这个简单的类中实现了接口:
class UInt64Raw implements JSONSerializer {
private $value;
public function __construct($number) {
$this->value = $number;
}
public function getValue() { return $this->value; }
public function toJSON() {
if (is_null($this->value)) return "null";
if ($this->value) return (string)$this->value;
return "0";
}
}
我已经改变了JSON编码器库的默认行为,以便在要编码的对象实现该接口时调用接口方法。
然后我可以从PDO中检索无符号的64位整数作为字符串,将它们包装在UInt64Raw
对象实例中,最后通过自定义JSON编码将它们作为数字传递给它们。