Serialização de classe do WordPress com PHP
Se você está acostumado a trabalhar com modelos (em qualquer fundação ou estrutura, mas especificamente no WordPress), há uma chance de precisar serializar uma instância do modelo em algum momento.
Claro, escrever a classe em um banco de dados usando as funções internas do PHP é bastante fácil; no entanto, é importante introduzir um pouco de flexibilidade, especialmente no que se refere à disponibilização em outras plataformas.
Por exemplo, digamos que você esteja criando um aplicativo no WordPress que terá algum tipo de informação exclusiva representada em um modelo. O modelo será então acessível por meio de um aplicativo móvel por meio da API REST.
Indiscutivelmente, uma das maneiras mais fáceis de fazer isso é usar JSON. É um formato que funciona em vários idiomas e plataformas, pode ser facilmente serializado e desserializado por essas plataformas e enviado pela rede conforme necessário.
E é incrivelmente fácil implementar isso em PHP. Você só precisa garantir que sua classe implemente a interface JsonSerializable.
A partir da documentação, a interface faz o seguinte:
Objetos que implementam JsonSerializable podem personalizar sua representação JSON quando codificados com json_encode().
O único método que uma classe precisa fornecer é jsonSerialize e, embora seja provável que você queira serializar todas as propriedades de um objeto (assim como seu estado sempre que for chamado), você pode personalizar a implementação da maneira que desejar.
Por exemplo, se você tem uma classe e quer apenas implementar sua propriedade name, então você implementaria a função assim :
<?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()
];
}
}
Se você quiser adicionar um pouco mais de complexidade, faça o seguinte :
<?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(),
],
];
}
}
E se você quiser se aprofundar na serialização das propriedades, poderá implementar um loop para construir um array :
<?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;
}
}
Seja qual for o caso, quando uma instância da classe é passada para a função json_encode, ela invocará a função jsonSerialize no objeto para que você obtenha a representação do objeto no formato JSON conforme projetado.
Isso é incrivelmente fácil e útil quando se trata de fornecer dados de uso em várias plataformas (ou até mesmo na mesma plataforma ).
