Серіалізація класів WordPress за допомогою PHP
Якщо ви звикли працювати з моделями (у будь-якій основі чи фреймворку, але особливо в WordPress), то є шанс, що вам може знадобитися серіалізувати екземпляр моделі в якийсь момент.
Звичайно, записати клас у базу даних за допомогою вбудованих функцій PHP досить легко; однак, введення трохи гнучкості, особливо в тому, що стосується того, щоб зробити його доступним на інших платформах, є важливим.
Наприклад, скажімо, ви створюєте програму на WordPress, яка матиме певний тип унікальної інформації, представленої в моделі. Потім модель буде доступна через мобільний додаток через REST API.
Можливо, одним із найпростіших способів зробити це є використання JSON. Це формат, який працює на різних мовах і платформах, може бути легко серіалізований і десеріалізований зазначеними платформами та надісланий по дроту за потреби.
І це неймовірно легко реалізувати в PHP. Вам просто потрібно переконатися, що ваш клас реалізує інтерфейс JsonSerializable.
Згідно з документацією, інтерфейс робить наступне:
Об’єкти, що реалізують JsonSerializable, можуть налаштовувати своє представлення JSON, коли кодуються за допомогою json_encode().
Єдиний метод, який має надати клас, — це jsonSerialize, і хоча ймовірно, що ви захочете серіалізувати всі властивості об’єкта (а також його стан під час кожного виклику), ви можете налаштувати реалізацію, як забажаєте.
Наприклад, якщо у вас є клас і ви просто хочете реалізувати його властивість name, тоді ви повинні реалізувати функцію так :
<?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, як ви спроектували.
Це неймовірно легко та корисно, коли йдеться про використання даних на кількох платформах (або навіть на одній платформі, якщо на те пішло).
