ホームページ > バックエンド開発 > PHPチュートリアル > JSonserializableインターフェイスの使用方法

JSonserializableインターフェイスの使用方法

Joseph Gordon-Levitt
リリース: 2025-02-21 10:33:13
オリジナル
124 人が閲覧しました

How to Use the JsonSerializable Interface

JSonserializableインターフェイスの使用方法

過去数年間、JSONはデータインターチェンジ形式の王として引き継いできました。 JSONの前に、XMLはねぐらを支配しました。複雑なデータのモデリングが得意でしたが、解析することは困難であり、非常に冗長です。 JSONは、非常に人間の読みやすい形式であり、迅速に解析し、その単純なキー/バリュー表現がXMLのすべての冗長性をカットするため、豊富なAjax駆動型サイトの急増で本当に離陸しました。

私たちは皆、より少ないコードを書くことでメンテナンスを必要とし、バグを導入することが少ないことが、私たち全員が達成したい目標であることに同意できると思います。この投稿では、JSonserializableと呼ばれるPHP 5.4.0で導入された、あまり知られていないインターフェイスを紹介したいと思います。 キーテイクアウト

PHP 5.4.0のjSonserializableインターフェイスは、オブジェクトのJSONエンコードされた表現を返すためのより効率的な方法を提供し、オブジェクトの外側にデータ構造を構築したり、オブジェクト内のエンコード機能を内面化する必要性を排除します。

jSonserializableインターフェイスにより、クラス内のJSonserializeメソッドの実装が可能になります。これは、クラスのインスタンスがJSONエンコードされているときに自動的にトリガーされます。このメソッドは、オブジェクトデータの配列を返し、変更が必要な場合にデータを更新するプロセスを簡素化します。 JSonserializableインターフェイスを実装すると、コードの保守性が向上し、バグを導入する可能性が低下します。これは、重複を削除し、他の人がJSonserializableのインスタンスであるかどうかをチェックすることでオブジェクトの能力をテストしやすくするためです。

    ugly
  • 最初のアプローチは、公開したいすべてのデータを含むオブジェクトの外側にデータ構造を構築することでした。
  • ここに配列を使用して、エンコードしたい顧客オブジェクトからのデータを保持しましたが、STDCLASSである可能性があります。
  • このアプローチは柔軟性があり、顧客オブジェクトが変更されず、この形式で顧客データが必要になることを知っていた非常に単純な状況で目的を果たしました。また、必要に応じて、他のソースからこの配列にデータを追加するオプションもありました。
しかし、私たち全員がいつか経験してきたので、私たちが行った仮定は、瞬間的な通知で偽りを証明することができます。顧客クラスにさらにデータを追加するように求められる要件が得られる場合があります。その新しいデータを消費サービスに返品する必要があり、多くの場所でこれを行いたいと思います。

想像できるように、このアプローチはすぐに面倒になります。この配列コードをアプリケーション全体で複製する必要があるだけでなく、必然的により多くの変更が来たときにすべてのインスタンスを更新することを忘れないでください。しかし、別の方法があります。

悪い

幸いなことに、最初の変更要求が届いたときは賢かったので、配列の複製が悪夢になることに気付いたので、私たちがやろうと決めたのは、オブジェクトのエンコード機能を内面化し、メンテナンスの問題を削除し、減少させることでした。バグを導入する可能性。

<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>
ログイン後にコピー
さらに、より多くのデータを追加して顧客オブジェクトから返す必要がある変更要求がある場合は、Tojsonメソッドを更新できます。

ただし、このアプローチには独自の欠点があります。やって来て、お客様を使用したい他の人は、簡単にチェックできるものではないため、このTojsonメソッドに注意する必要があるため、正確なドキュメントが必要です。また、この方法は

jsonを返していることを覚えておく必要があります(ただし、メソッドの外側にシリアル化を移動できます)。これにより、顧客データと他のデータソースのソースを組み合わせると、この方法の結果をもう一度エンコードしないように注意する必要があるため、それは厄介なバグを引き起こすため、より厄介になります。

good 最後に、jsonserializableインターフェイスを入力します。これにより、悪いシナリオの維持可能性の利点と、ugいシナリオのすべての柔軟性が得られます。このインターフェイスを使用するには、古いバージョンよりも多くの改善があるため、とにかく本当にやるべきPHP 5.4.0を実行する必要があります。

だから、ビジネスに。

ご覧のとおり、インターフェイスをクラスに追加し、クラスの本文にJsonserializeメソッドを追加してインターフェース契約を満たすことにより、JSonserializableを実装します。

jsonserializeメソッドでは、他の例と同じように、オブジェクトデータの配列を構築および返却します。繰り返しになりますが、変更があれば、この1つの方法を更新することができます。 JSonserializeメソッドは配列を返すだけであることがわかります。

このメソッドをトリガーしたいときに魔法が届きます。JSONがこのクラスのインスタンスをエンコードするだけで、このメソッドは自動的に呼ばれ、データの配列が返され、エンコードされます!クラスがインターフェイスを実装したので、このクラスがJsonserializableのインスタンスであるかどうかを確認できることから利益を得ることができます。必要に応じて、メソッドのヒントを入力して、jsonserializableインターフェイスが渡されることを確認することもできます。

要約

この簡単な実装により、複製を削除し、メンテナンスの量を減らし、バグを導入する可能性を減らしました。また、他の人がコードを使用して、jsonserializableのインスタンスであるかどうかを確認してオブジェクトの能力をエンコードする能力をテストすることを簡単にしました。

上記の例はもちろん不自然ですが、このインターフェースを使用して自分で使用するように促すことの利点を実証することができたことを願っています。 Jsonserializableインターフェイスに関するよくある質問(FAQ)

PHPのJSonserializableインターフェイスの主な目的は何ですか?

​​

PHPのJSonserializableインターフェイスは、主にオブジェクトのJSON表現をカスタマイズするために使用されます。オブジェクトがjson_encode()関数に渡されると、jsonserializableインターフェイスを実装する場合、jsonserialize()メソッドが呼び出され、オブジェクトがどのようにシリアル化するかを決定することができます。これにより、JSON出力に対する高いレベルの制御が提供され、エンコードされる前に複雑なデータ構造を管理したり、データの変換を実行しやすくします。 🎜> jSonserialize()メソッドは、jsonserializableインターフェイスの一部です。このインターフェイスを実装するオブジェクトがjson_encode()に渡されると、jsonserialize()メソッドが自動的に呼び出されます。この方法では、JSONにシリアル化する準備ができているデータ構造を返す必要があります。これは、配列、文​​字列、数字、または別のオブジェクトでもあります。返されたデータは、json_encode()によってjson文字列にエンコードされます。 jSonserialize()メソッドは、オブジェクトのプライベートプロパティと保護されたプロパティにアクセスできるため、シリアル化のために返されるデータにこれらを含めることができます。これは、オブジェクトの内部状態をJSONにエンコードしたい場合に役立ちますが、クラス内でプロパティをプライベートまたは保護したままにしておきます。 > jsonserialize()メソッド内に例外がスローされている場合、json_encode()によってキャッチされません。代わりに、json_encode()はfalseを返し、例外をキャッチして個別に処理する必要があります。 jsonserialize()内の例外を処理するには、メソッド自体内でトライキャッチブロックを使用して、例外を管理し、シリアル化のために有効なデータ構造を返すことができます。 ?ネストされたオブジェクトを使用してjsonserializableインターフェイスを使用するにはどうすればよいですか?はい、Arrayを使用したJSonserializableインターフェイスを使用できます。配列にオブジェクトが含まれている場合、各オブジェクトはjSonserializableインターフェイスを実装する必要があります。 json_encode()が配列で呼び出されると、配列内の各オブジェクトのjsonserialize()を呼び出し、それぞれがどのようにシリアル化するかを決定できるようにします。 ?

jSonserialize()メソッドからカスタムデータ構造を返すことにより、JSON出力をカスタマイズできます。これは、カスタムキー、文字列、数字、または別のオブジェクトを備えた配列である可能性があります。 jsonserialize()から返すデータ構造は、jsonにエンコードされたデータになります。多次元配列。配列にオブジェクトが含まれている場合、各オブジェクトはjSonserializableインターフェイスを実装する必要があります。 json_encode()が多次元配列で呼び出されると、配列内の各オブジェクトのjsonserialize()を呼び出し、それぞれがシリアル化方法を決定できるようにします。アレイ?

はい、非分類アレイを使用したJSonserializableインターフェイスを使用できます。配列にオブジェクトが含まれている場合、各オブジェクトはjSonserializableインターフェイスを実装する必要があります。 json_encode()が非共同配列で呼び出されると、配列内の各オブジェクトのjsonserialize()を呼び出し、各オブジェクトがどのようにシリアル化するかを決定できるようにします。

以上がJSonserializableインターフェイスの使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート