我对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();
所以我们有一个类,它实现了接口。当我们调用count()
函数时,它已经写在MyThings
类中。这很容易理解。
但是当我们使用JsonSerializable
这样的界面时:
<?php
class Thing implements JsonSerializable {
public function jsonSerialize() {
// do something
}
}
$obj = new Thing();
//call count method on $obj
json_encode($obj);
jsonSerialize()
内{p> Thing
与json_encode()
电话一起运行。
如果我们打电话,这是可以理解的
$obj->jsonSerialize();
然后在类中有一个名为jsonSerialize()
的函数。但是,当我们运行json_encode()
时,这是如何工作的?这是如何构建在PHP?有人能解释一下这里使用的模式类型吗?
答案 0 :(得分:1)
implement
JsonSerializable然后实现jsonSerialize()方法的对象。然后,当json_encode()将其输入序列化为JSON时,如果序列化的值为JsonSerializable
,则会调用jsonSerialize()
方法和结果该方法的一部分用作对象的序列化表示。
例如,从PHP文档:
<?php class IntegerValue implements JsonSerializable { public function __construct($number) { $this->number = (integer) $number; } public function jsonSerialize() { return $this->number; } } echo json_encode(new IntegerValue(1), JSON_PRETTY_PRINT);
将输出
1
这是表示数字1的json_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);
将输出
{
"boolean": true,
"random_integer": 1140562437,
"int_from_object": 42,
"another_object": {}
}
值得注意的是random_integer
不是存储在任何地方的静态值;它在每次执行时都会改变;并且int_from_object
表明json_encode()
会递归评估JsonSerializable
个实例。