在物件中使用 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}"