PHP如何使用JsonSerializable接口?
我对PHP如何使用JsonSerializable接口?,php,Php,我对JsonSerializable的工作原理感到困惑。让我再详细说明一下这个问题 通常,我们使用如下接口: <?php interface Countable { /* Methods */ public function count(); } class MyThings implements Countable { public function count() { return count($this->arrayOfThi
JsonSerializable
的工作原理感到困惑。让我再详细说明一下这个问题
通常,我们使用如下接口:
<?php
interface Countable {
/* Methods */
public function count();
}
class MyThings implements Countable
{
public function count() {
return count($this->arrayOfThings);
}
}
$obj = new MyThings();
//call count method on $obj
$obj->count();
<?php
class Thing implements JsonSerializable {
public function jsonSerialize() {
// do something
}
}
$obj = new Thing();
//call count method on $obj
json_encode($obj);
jsonSerialize()
insideThing
使用json\u encode()调用运行。
我们打电话是可以理解的
$obj->jsonSerialize();
然后类中有一个名为jsonSerialize()
的函数。但是,当我们运行json\u encode()
时,这是如何工作的呢?这是如何在php中构造的?有人能解释一下这里使用的是什么类型的模式吗?实现的对象然后实现一个方法。然后,当将其输入序列化为JSON时,如果序列化的值是JsonSerializable
,它将调用jsonSerialize()
方法,该方法的结果将用作对象的序列化表示
例如,在PHP文档中:
这是表示数字1的json\u encode
d值。PHP文档还提供了三个类似的示例,从对象返回值,但是由于jsonSerialize()
允许您指定要返回的实际数据,因此必须认识到它可以返回任何内容。例如:
class JsonSerializeExample implements JsonSerializable {
public function jsonSerialize() {
return [
'boolean' => true,
'random_integer' => rand(),
'int_from_object' => new IntegerValue(42),
'another_object' => new stdClass,
];
}
}
$obj = new JsonSerializeExample();
echo json_encode($obj, JSON_PRETTY_PRINT);
将输出
1
{
"boolean": true,
"random_integer": 1140562437,
"int_from_object": 42,
"another_object": {}
}
需要注意的是,random_integer
不是存储在任何地方的静态值;它在每次执行时都会发生变化;来自对象的int\u
演示了json\u encode()
将递归计算JsonSerializable
实例。但是jsonSerialize
方法是如何运行的呢?背景中发生了什么魔法?@SeventhSteel这不是真正的魔法。json\u encode()
的内部实现是为了在尝试序列化实现JsonSerializable的对象时调用jsonSerialize()
,而不是执行通常用于序列化对象的操作。
{
"boolean": true,
"random_integer": 1140562437,
"int_from_object": 42,
"another_object": {}
}