在物件中使用 JsonSerializable

PHP 5.x >= 5.4

構建 REST API 時,可能需要減少要傳遞給客戶端應用程式的物件的資訊。為此,此示例說明了如何使用 JsonSerialiazble 介面。

在此示例中,類 User 實際上擴充套件了 hypotetical ORM 的 DB 模型物件。

class User extends Model implements JsonSerializable {
    public $id;
    public $name;
    public $surname;
    public $username;
    public $password;
    public $email;
    public $date_created;
    public $date_edit;
    public $role;
    public $status;

    public function jsonSerialize() {
        return [
            'name' => $this->name,
            'surname' => $this->surname,
            'username' => $this->username
        ];
    }
}

通過提供 jsonSerialize() 方法將 JsonSerializable 實現新增到類中。

public function jsonSerialize()

現在在你的應用程式控制器或指令碼中,當將物件 User 傳遞給 json_encode() 時,你將獲得 jsonSerialize() 方法的返回 json 編碼陣列,而不是整個物件。

json_encode($User);

將返回:

{"name":"John", "surname":"Doe", "username" : "TestJson"}

屬性值示例

這將減少從 RESTful 端點返回的資料量,並允許從 json 表示中排除物件屬性。

使用私有和受保護的屬性與 json_encode()

為避免使用 JsonSerializable,還可以使用 private 或 protected 屬性來隱藏 json_encode() 輸出中的類資訊。然後 Class 不需要實現\ JsonSerializable。

json_encode() 函式只會將類的公共屬性編碼為 JSON。

<?php

class User {
    // private properties only within this class
    private $id;
    private $date_created;
    private $date_edit;

    // properties used in extended classes
    protected $password;
    protected $email;
    protected $role;
    protected $status;

    // share these properties with the end user        
    public $name;
    public $surname;
    public $username;

    // jsonSerialize() not needed here
}        

$theUser = new User();

var_dump(json_encode($theUser));

輸出:

string(44) "{"name":null,"surname":null,"username":null}"