PHP如何使用JsonSerializable接口?

时间:2015-07-04 07:25:57

标签: php

我对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> Thingjson_encode()电话一起运行。 如果我们打电话

,这是可以理解的
$obj->jsonSerialize();

然后在类中有一个名为jsonSerialize()的函数。但是,当我们运行json_encode()时,这是如何工作的?这是如何构建在PHP?有人能解释一下这里使用的模式类型吗?

1 个答案:

答案 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个实例。