recherche
Maisondéveloppement back-endtutoriel phpComment utiliser l'interface jsonserialisable

How to Use the JsonSerializable Interface

Comment utiliser l'interface jsonserialisable

Au cours des dernières années, JSON a pris le relais en tant que formats King of Data Interchange. Avant JSON, XML a gouverné le perchoir. C'était génial pour modéliser des données complexes, mais il est difficile à analyser et est très verbeux. JSON a vraiment décollé avec la prolifération de riches sites axés sur l'Ajax car il s'agit d'un format lisible très humain, rapide à analyser et sa représentation simple / valeur clé supprime toute la verbosité de XML.

Je pense que nous pourrions tous convenir que écrire moins de code qui nécessite à son tour moins de maintenance et introduit moins de bogues est un objectif que nous aimerions tous atteindre. Dans cet article, je voudrais vous présenter une interface peu connue qui a été introduite dans PHP 5.4.0 appelée jsonSerializable.

Avant que l'interface JSonSerialisable ne soit disponible, le retour d'une représentation codée JSON d'un objet pour un service consommé signifiait l'une des deux choses.

Les plats clés

  • L'interface JSonSerialisable dans PHP 5.4.0 offre un moyen plus efficace de renvoyer une représentation codée JSON d'un objet, éliminant la nécessité de construire une structure de données en dehors de l'objet ou d'internaliser la fonctionnalité de codage au sein de l'objet.
  • L'interface jsonSerializable permet la mise en œuvre d'une méthode jsonserialize au sein de la classe, qui est automatiquement déclenchée lorsqu'une instance de la classe est encodée JSON. Cette méthode renvoie un tableau des données de l'objet, simplifiant le processus de mise à jour des données si des modifications sont nécessaires.
  • La mise en œuvre de l'interface JSonSerializable améliore la maintenabilité du code et réduit les chances d'introduire des bogues, car il supprime la duplication et permet aux autres de tester plus facilement la capacité de l'objet à être encodé en vérifiant s'il s'agit d'une instance de JSonSerializable.

le laid

La première approche a été de construire une structure de données en dehors de l'objet qui contenait toutes les données que nous voulions exposer.

<span><span><?php </span></span><span>
</span><span><span>class Customer
</span></span><span><span>{
</span></span><span>
</span><span>    <span>private $email = null;
</span></span><span>    <span>private $name = null;
</span></span><span>
</span><span>    <span>public function __construct($email, $name)
</span></span><span>    <span>{
</span></span><span>        <span>$this->email = $email;
</span></span><span>        <span>$this->name = $name;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function getName()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->name;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function getEmail()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->email;
</span></span><span>    <span>}
</span></span><span><span>}
</span></span><span>
</span><span><span>$customer = new Customer('customer@sitepoint.com', 'Joe');
</span></span><span>
</span><span><span>$data = [
</span></span><span>    <span>'customer' => [
</span></span><span>        <span>'email' => $customer->getEmail(),
</span></span><span>        <span>'name' => $customer->getName()
</span></span><span>    <span>]
</span></span><span><span>];
</span></span><span>
</span><span><span>echo json_encode($data);</span></span></span>

Nous avons utilisé un tableau ici pour maintenir les données de l'objet client que nous voulions encoder, mais cela aurait tout aussi facilement pu être une STDClass.

Cette approche était flexible et a servi son objectif dans des situations très simples où nous savions que l'objet client n'allait pas changer et nous n'allions que les données des clients dans ce format, à cet endroit. Nous avions également la possibilité d'ajouter des données à ce tableau à partir d'autres sources si nous en avions besoin.

Cependant, comme nous l'avons tous vécu à un moment ou à un autre, les hypothèses que nous avons faites peuvent être prouvées fausses à un préavis des instants. Nous pourrions obtenir une exigence qui nous demande d'ajouter plus de données à la classe client. Ces nouvelles données devront être renvoyées au service consommé et nous voulons le faire dans de nombreux endroits.

Comme vous pouvez l'imaginer, cette approche devient rapidement gênante. Non seulement nous devons dupliquer ce code de tableau partout dans notre application, mais nous devons nous rappeler de mettre à jour tous ces cas où davantage de changements entrent inévitablement. Il existe cependant un autre moyen, cela nous aidera à annuler certains de ces problèmes.

le mauvais

Heureusement, nous étions intelligents lorsque la première demande de changement est arrivée et nous avons réalisé que la duplication de notre tableau allait être un cauchemar, donc ce que nous avons décidé de faire était d'internaliser cette fonctionnalité de codage dans notre objet, en supprimant les problèmes de maintenance et en réduisant le la probabilité d'introduire des bugs.

<span><span><?php </span></span><span>
</span><span><span>class Customer
</span></span><span><span>{
</span></span><span>
</span><span>    <span>private $email = null;
</span></span><span>    <span>private $name = null;
</span></span><span>
</span><span>    <span>public function __construct($email, $name)
</span></span><span>    <span>{
</span></span><span>        <span>$this->email = $email;
</span></span><span>        <span>$this->name = $name;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function getName()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->name;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function getEmail()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->email;
</span></span><span>    <span>}
</span></span><span><span>}
</span></span><span>
</span><span><span>$customer = new Customer('customer@sitepoint.com', 'Joe');
</span></span><span>
</span><span><span>$data = [
</span></span><span>    <span>'customer' => [
</span></span><span>        <span>'email' => $customer->getEmail(),
</span></span><span>        <span>'name' => $customer->getName()
</span></span><span>    <span>]
</span></span><span><span>];
</span></span><span>
</span><span><span>echo json_encode($data);</span></span></span>

Maintenant, si d'autres demandes de modification viennent qui veulent que plus de données soient ajoutées et renvoyées de l'objet client, nous pouvons simplement mettre à jour la méthode TOJSON.

Cette approche présente ses propres inconvénients, cependant. Quiconque vient et veut utiliser notre client doit être conscient de cette méthode Tojson, car ce n'est pas quelque chose qui est facilement vérifié, nous aurions donc besoin de documentation précise. Nous devons également nous rappeler que cette méthode renvoie JSON maintenant (bien que nous puissions déplacer la sérialisation en dehors de la méthode). Cela rend la combinaison des données des clients avec d'autres sources de données plus maladroites, car nous devons faire attention à ne pas coder à nouveau le résultat de cette méthode car cela provoquerait des bogues désagréables.

le bon

Enfin, entrez l'interface JSonSerializable. Cela nous donne toute la flexibilité du scénario laid avec les avantages de maintenabilité du mauvais scénario. Bien que pour utiliser cette interface, vous devrez exécuter PHP 5.4.0 que vous devriez vraiment faire de toute façon, car il existe de nombreuses améliorations par rapport aux versions plus anciennes.

ainsi, aux affaires.

<span><span><?php </span></span><span>
</span><span><span>class Customer
</span></span><span><span>{
</span></span><span>
</span><span>    <span>public $email = null;
</span></span><span>    <span>public $name = null;
</span></span><span>
</span><span>    <span>public function __construct($email, $name)
</span></span><span>    <span>{
</span></span><span>        <span>$this->email = $email;
</span></span><span>        <span>$this->name = $name;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function getName()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->name;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function getEmail()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->email;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function toJson()
</span></span><span>    <span>{
</span></span><span>        <span>return json_encode([
</span></span><span>            <span>'customer' => [
</span></span><span>                <span>'email' => $this->getEmail(),
</span></span><span>                <span>'name' => $this->getName()
</span></span><span>            <span>]
</span></span><span>        <span>]);
</span></span><span>    <span>}
</span></span><span><span>}
</span></span><span>
</span><span><span>$customer = new Customer('customer@sitepoint.com', 'Joe');
</span></span><span>
</span><span><span>echo $customer->toJson();</span></span></span>

Comme vous pouvez le voir, nous implémentons JSonSerializable en ajoutant l'interface à notre classe, puis en ajoutant une méthode jsonSerialize au corps de notre classe pour satisfaire le contrat d'interfaces.

Dans la méthode JSonSerialize, nous construisons et renvoyons un tableau des données d'objet, tout comme nous l'avons fait avec les autres exemples. Encore une fois, si quelque chose change, nous pouvons simplement mettre à jour cette seule méthode. Vous remarquerez que la méthode jsonserialize ne renvoie qu'un tableau.

La magie vient lorsque vous souhaitez déclencher cette méthode, tout ce que nous avons à faire maintenant, c'est que JSON encode une instance de cette classe et cette méthode sera appelée automatiquement, le tableau de données renvoyé puis encodé! Maintenant que la classe implémente une interface, nous bénéficions de la possibilité de vérifier si cette classe est une instance de jsonserializable. Si vous le vouliez, vous pouvez également taper un indice des méthodes pour vous assurer qu'une interface jsonSerialisable est passée.

Résumé

Avec cette implémentation simple, nous avons supprimé la duplication, diminué la quantité de maintenance et réduit les chances d'introduire des bogues. Nous avons également rendu trivial pour qu'une autre personne utilise notre code pour tester la capacité de l'objet à être codé en vérifiant s'il s'agit d'une instance de jsonSerialisable.

Les exemples ci-dessus sont bien sûr artificiels, cependant, j'espère que j'ai réussi à démontrer les avantages de l'utilisation de cette interface et de vous inspirer à aller de l'avant et à l'utiliser vous-même.

Questions fréquemment posées (FAQ) sur l'interface jsonsérialisable

Quel est le but principal de l'interface JSonSerialisable dans PHP?

L'interface jsonSerialisable dans PHP est principalement utilisée pour personnaliser la représentation JSON d'un objet. Lorsqu'un objet est transmis à la fonction json_encode (), s'il implémente l'interface jsonSerializable, la méthode jsonSerialize () sera appelée, permettant à l'objet de dicter comment il doit être sérialisé. Cela fournit un niveau élevé de contrôle sur la sortie JSON, ce qui facilite la gestion des structures de données complexes ou effectuer des transformations sur les données avant qu'elle ne soit codée.

Comment fonctionne la méthode jNonSerialize ()?

La méthode jsonSerialize () fait partie de l'interface JSonSerializable. Lorsqu'un objet implémentant cette interface est transmis à json_encode (), la méthode jsonSerialize () est automatiquement appelée. Cette méthode doit renvoyer une structure de données prête à être sérialisée en JSON. Il peut s'agir d'un tableau, d'une chaîne, d'un nombre ou même d'un autre objet. Les données renvoyées seront ensuite codées par JSON_Encode () dans une chaîne JSON.

Puis-je utiliser une interface JSonSerializable avec des propriétés privées?

Oui, vous pouvez utiliser l'interface JSonSerialisable avec des propriétés privées. La méthode jsonSerialize () a accès aux propriétés privées et protégées de l'objet, vous permettant de les inclure dans les données renvoyées pour la sérialisation. Cela peut être utile lorsque vous souhaitez encoder l'état interne d'un objet en JSON, mais gardez toujours les propriétés privées ou protégées au sein de la classe.

Comment puis-je gérer les exceptions dans la méthode jsonSerialize ()?

Si une exception est jetée dans la méthode jsonSerialize (), elle ne sera pas capturée par JSON_ENCODOD (). Au lieu de cela, json_encode () reviendra faux, et l'exception devra être capturée et gérée séparément. Pour gérer les exceptions dans jSonSerialize (), vous pouvez utiliser un bloc d'essai dans la méthode elle-même, vous permettant de gérer l'exception et de renvoyer une structure de données valide pour la sérialisation.

Puis-je utiliser l'interface jsonSerialisable pour décoder JSON ?

Non, l'interface JSonSerialisable n'est utilisée que pour coder des objets en JSON. Pour décoder JSON, vous utiliseriez la fonction json_decode (). Cependant, vous pouvez créer une méthode au sein de votre classe pour gérer le décodage et la reconstruction d'un objet à partir d'une chaîne JSON.

Comment puis-je utiliser une interface JSonSerializable avec des objets imbriqués?

Si vous avez un objet qui contient d'autres objets et que vous souhaitez coder toute la structure en JSON, chaque objet imbriqué doit également implémenter l'interface JSonSerialisable. Lorsque JSON_ENCODE () est appelé sur l'objet parent, il appellera également jSonSerialize () sur chaque objet imbriqué, permettant à chacun de dicter comment il devrait être sérialisé.

Puis-je utiliser une interface jsonSerialisable avec les tableaux?

Oui, vous pouvez utiliser l'interface jsonSerialisable avec les tableaux. Si le tableau contient des objets, chaque objet doit implémenter l'interface jsonSerializable. Lorsque json_encode () est appelé sur le tableau, il appellera jsonSerialize () sur chaque objet dans le tableau, permettant à chacun de dicter comment il doit être sérialisé.

Comment puis-je personnaliser la sortie JSON avec JSONSerializable Interface Interface ?

Vous pouvez personnaliser la sortie JSON en renvoyant une structure de données personnalisée à partir de la méthode jsonSerialize (). Il peut s'agir d'un tableau avec des touches personnalisées, une chaîne, un nombre ou un autre objet. La structure de données que vous retournez de jSonSerialize () sera les données qui sont codées en JSON.

Puis-je utiliser une interface JSonSerializable avec des tableaux multidimensionnels?

Oui, vous pouvez utiliser l'interface JSonSerialisable avec Tableaux multidimensionnels. Si les tableaux contiennent des objets, chaque objet doit implémenter l'interface jsonSerializable. Lorsque JSON_ENCODE () est appelé sur le tableau multidimensionnel, il appellera JSonSerialize () sur chaque objet dans le tableau, permettant à chacun de dicter comment il doit être sérialisé.

Puis-je utiliser JsonSerialidable Interface avec non assocatif tableaux?

Oui, vous pouvez utiliser l'interface JSonSerializable avec des tableaux non associatifs. Si le tableau contient des objets, chaque objet doit implémenter l'interface jsonSerializable. Lorsque JSON_ENCODE () est appelé sur le tableau non associatif, il appellera JSonSerialize () sur chaque objet dans le tableau, permettant à chacun de dicter comment il doit être sérialisé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
PHP Logging: meilleures pratiques pour l&amp;#39;analyse du journal PHPPHP Logging: meilleures pratiques pour l&amp;#39;analyse du journal PHPMar 10, 2025 pm 02:32 PM

La journalisation PHP est essentielle pour surveiller et déboguer les applications Web, ainsi que pour capturer des événements critiques, des erreurs et un comportement d&#39;exécution. Il fournit des informations précieuses sur les performances du système, aide à identifier les problèmes et prend en charge le dépannage plus rapide

Travailler avec les données de session Flash dans LaravelTravailler avec les données de session Flash dans LaravelMar 12, 2025 pm 05:08 PM

Laravel simplifie la gestion des données de session temporaires à l'aide de ses méthodes de flash intuitives. Ceci est parfait pour afficher de brefs messages, alertes ou notifications dans votre application. Les données ne persistent que pour la demande ultérieure par défaut: $ demande-

Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API RESTCurl dans PHP: Comment utiliser l'extension PHP Curl dans les API RESTMar 14, 2025 am 11:42 AM

L'extension PHP Client URL (CURL) est un outil puissant pour les développeurs, permettant une interaction transparente avec des serveurs distants et des API REST. En tirant parti de Libcurl, une bibliothèque de transfert de fichiers multi-protocol très respectée, PHP Curl facilite Efficient Execu

Misque de réponse HTTP simplifié dans les tests LaravelMisque de réponse HTTP simplifié dans les tests LaravelMar 12, 2025 pm 05:09 PM

Laravel fournit une syntaxe de simulation de réponse HTTP concise, simplifiant les tests d'interaction HTTP. Cette approche réduit considérablement la redondance du code tout en rendant votre simulation de test plus intuitive. L'implémentation de base fournit une variété de raccourcis de type de réponse: Utiliser illuminate \ support \ faades \ http; Http :: faux ([[ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

12 meilleurs scripts de chat PHP sur Codecanyon12 meilleurs scripts de chat PHP sur CodecanyonMar 13, 2025 pm 12:08 PM

Voulez-vous fournir des solutions instantanées en temps réel aux problèmes les plus pressants de vos clients? Le chat en direct vous permet d'avoir des conversations en temps réel avec les clients et de résoudre leurs problèmes instantanément. Il vous permet de fournir un service plus rapide à votre personnalité

Expliquez le concept de liaison statique tardive en PHP.Expliquez le concept de liaison statique tardive en PHP.Mar 21, 2025 pm 01:33 PM

L'article traite de la liaison statique tardive (LSB) dans PHP, introduite dans PHP 5.3, permettant une résolution d'exécution de la méthode statique nécessite un héritage plus flexible. Problème main: LSB vs polymorphisme traditionnel; Applications pratiques de LSB et perfo potentiel

Frameworks de personnalisation / d'extension: comment ajouter des fonctionnalités personnalisées.Frameworks de personnalisation / d'extension: comment ajouter des fonctionnalités personnalisées.Mar 28, 2025 pm 05:12 PM

L'article examine l'ajout de fonctionnalités personnalisées aux cadres, en se concentrant sur la compréhension de l'architecture, l'identification des points d'extension et les meilleures pratiques pour l'intégration et le débogage.

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌

Outils chauds

SublimeText3 version anglaise

SublimeText3 version anglaise

Recommandé : version Win, prend en charge les invites de code !

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Version Mac de WebStorm

Version Mac de WebStorm

Outils de développement JavaScript utiles

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

SublimeText3 Linux nouvelle version

SublimeText3 Linux nouvelle version

Dernière version de SublimeText3 Linux