Sérialisation de classes WordPress avec PHP
Si vous avez l’habitude de travailler avec des modèles (dans n’importe quelle fondation ou framework, mais spécifiquement WordPress), il est possible que vous ayez besoin de sérialiser une instance du modèle à un moment donné.
Bien sûr, écrire la classe dans une base de données en utilisant les fonctions intégrées de PHP est assez simple ; cependant, il est important d’introduire un peu de flexibilité, en particulier en ce qui concerne sa mise à disposition sur d’autres plates-formes.
Par exemple, disons que vous construisez une application sur WordPress qui va avoir un certain type d’information unique représentée dans un modèle. Le modèle sera alors accessible via une application mobile via l’API REST.
L’un des moyens les plus simples d’y parvenir est sans doute d’utiliser JSON. C’est un format qui fonctionne sur différentes langues et plates-formes, qui peut être facilement sérialisé et désérialisé par lesdites plates-formes, et envoyé sur le réseau selon les besoins.
Et c’est incroyablement facile à implémenter en PHP. Vous devez juste vous assurer que votre classe implémente l’ interface JsonSerializable.
D’après la documentation, l’interface effectue les opérations suivantes :
Les objets implémentant JsonSerializable peuvent personnaliser leur représentation JSON lorsqu’ils sont encodés avec json_encode().
La seule méthode qu’une classe doit fournir est jsonSerialize, et bien qu’il soit probable que vous souhaitiez sérialiser toutes les propriétés d’un objet (ainsi que son état chaque fois qu’il est appelé), vous pouvez personnaliser l’implémentation comme vous le souhaitez.
Par exemple, si vous avez une classe et que vous voulez juste implémenter sa propriété name, alors vous implémenterez la fonction comme ceci :
<?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 vous vouliez ajouter un peu plus de complexité, alors vous pouvez faire ceci :
<?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(),
],
];
}
}
Et si vous vouliez vous lancer dans la sérialisation des propriétés, vous pouvez implémenter une boucle pour construire un tableau :
<?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;
}
}
Quel que soit le cas, lorsqu’une instance de la classe est transmise à la fonction json_encode, elle invoquera la fonction jsonSerialize sur l’objet afin que vous obteniez la représentation de l’objet au format JSON tel que vous l’avez conçu.
C’est incroyablement facile et utile lorsqu’il s’agit de fournir des données d’utilisation sur plusieurs plates-formes (ou même sur la même plate -forme, d’ailleurs).
