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()
inside
Thing
使用
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": {}
}