Serialización de clases de WordPress con PHP
Si está acostumbrado a trabajar con modelos (en cualquier base o marco, pero específicamente en WordPress), existe la posibilidad de que necesite serializar una instancia del modelo en algún momento.
Claro, escribir la clase en una base de datos usando las funciones integradas de PHP es bastante fácil; sin embargo, es importante introducir un poco de flexibilidad, especialmente en lo que respecta a que esté disponible en otras plataformas.
Por ejemplo, supongamos que está creando una aplicación en WordPress que tendrá algún tipo de información única representada en un modelo. Luego se podrá acceder al modelo a través de una aplicación móvil a través de la API REST.
Podría decirse que una de las formas más fáciles de hacer esto es usar JSON. Es un formato que funciona en varios idiomas y plataformas, que dichas plataformas pueden serializar y deserializar fácilmente y enviar por cable según sea necesario.
Y es increíblemente fácil implementar esto en PHP. Solo necesita asegurarse de que su clase implemente la interfaz JsonSerializable.
De la documentación, la interfaz hace lo siguiente:
Los objetos que implementan JsonSerializable pueden personalizar su representación JSON cuando se codifican con json_encode().
El único método que debe proporcionar una clase es jsonSerialize y, aunque es probable que desee serializar todas las propiedades de un objeto (así como su estado siempre que se llame), puede personalizar la implementación como desee.
Por ejemplo, si tiene una clase y solo desea implementar su propiedad de nombre, implementaría la función de esta manera :
<?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()
];
}
}
Si desea agregarle un poco más de complejidad, puede hacer esto :
<?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(),
],
];
}
}
Y si desea participar en la serialización de las propiedades, puede implementar un bucle para crear una matriz :
<?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;
}
}
Cualquiera que sea el caso, cuando una instancia de la clase se pasa a la función json_encode, invocará la función jsonSerialize en el objeto para que obtenga la representación del objeto en formato JSON como lo diseñó.
Esto es increíblemente fácil y útil cuando se trata de proporcionar el uso de datos en múltiples plataformas (o incluso en la misma plataforma, para el caso).
