Сериализация классов WordPress с помощью PHP
Если вы привыкли работать с моделями (в любом фонде или фреймворке, но конкретно в WordPress), то есть шанс, что в какой-то момент вам может понадобиться сериализовать экземпляр модели.
Конечно, записать класс в базу данных с помощью встроенных функций PHP достаточно просто; однако важно внести некоторую гибкость, особенно в том, что касается доступности на других платформах.
Например, предположим, что вы создаете приложение на WordPress, которое будет иметь некоторую уникальную информацию, представленную в модели. После этого модель будет доступна через мобильное приложение через REST API.
Возможно, один из самых простых способов сделать это — использовать JSON. Это формат, который работает на разных языках и платформах, может быть легко сериализован и десериализован указанными платформами и отправлен по сети по мере необходимости.
И это невероятно легко реализовать на PHP. Вам просто нужно убедиться, что ваш класс реализует интерфейс JsonSerializable.
Из документации интерфейс делает следующее:
Объекты, реализующие JsonSerializable, могут настраивать свое представление JSON при кодировании с помощью json_encode().
Единственный метод, который должен предоставить класс, — это jsonSerialize, и хотя, вероятно, вы захотите сериализовать все свойства объекта (а также его состояние при каждом вызове), вы можете настроить реализацию по своему усмотрению.
Например, если у вас есть класс, и вы просто хотите реализовать его свойство имени, вы должны реализовать такую функцию :
<?php
class Acme implements JsonSerializable
{
/**
* @var string the name of the model as represented on the front-end.
*/
protected $name;
// More code here.
/**
* @return string a JSON representation of this class
*/
public function jsonSerialize()
{
return [
'name' => $this->getName()
];
}
}
Если вы хотите добавить немного сложности, вы можете сделать это :
<?php
class Acme implements JsonSerializable
{
/**
* @var string the name of the model as represented on the front-end.
*/
protected $name;
/**
* @var array an array of features about this object.
*/
protected $features;
// More code here.
/**
* @return string a JSON representation of this class
*/
public function jsonSerialize()
{
return [
'name' => $this->getName(),
'features' => [
'hair' => $this->getHairColor(),
'eyes' => $this->getEyeColor(),
],
];
}
}
И если вы хотите полностью погрузиться в сериализацию свойств, вы можете реализовать цикл для построения массива :
<?php
class Acme implements JsonSerializable
{
/**
* @var string the name of the model as represented on the front-end.
*/
protected $name;
/**
* @var array an array of features about this object.
*/
protected $features;
// More code here.
/**
* @return string a JSON representation of this class
*/
public function jsonSerialize()
{
$objectArray = [];
foreach ($this as $key => $value) {
$objectArray[$key] = $value;
}
return $objectArray;
}
}
В любом случае, когда экземпляр класса передается функции json_encode, он вызывает функцию jsonSerialize для объекта, чтобы вы получили представление объекта в формате JSON, как вы его разработали.
Это невероятно просто и полезно, когда речь идет об использовании данных на нескольких платформах (или даже на одной и той же платформе, если уж на то пошло).
