次のシナリオを検討してください。ID、名前、電子メール、パスワードハッシュ、登録時間など、多くのフィールドを含むユーザーモデル$ユーザーがあります。外部世界にインターフェイスを提供する場合、IDや名前などのフィールドの一部を返すだけで、URLや形式のスプライシングなどの特定のフィールドを処理する必要があります。モデル自体のロジックを汚染しないようにするために、同時に、コードは簡潔で明確で、匿名のクラスが役立ちます。
匿名のクラスとjsonserializableの実装を使用した例を次に示します。
<code> <?php $ user =(object)[
'id' => 101、
'name' => 'Alice'、
'avatar' => 'avatar101.jpg'、
];
function presentuser(object $ user):jsonserializable {
新しいクラス($ user)を返すJsonserializable {
プライベートオブジェクト$ユーザー;
public function __construct(object $user) {
$this->user = $user;
}
public function jsonSerialize(): array {
return [
'id' => $this->user->id,
'name' => $this->user->name,
'avatar_url' => 'https://gitbox.net/uploads/avatars/' . $this->user->avatar,
];
}
};
}
ヘッダー( 'Content-Type:Application/JSON');
echo json_encode(spressuser($ user)、json_pretty_print);
</code>
匿名のクラスは、コンテキスト<br>に密接に結びついています 匿名のクラスは、この使用にのみ存在するコンストラクターを介して$ユーザーオブジェクトをキャプチャし、クラス定義の冗長性を減らします。
JSonserializableインターフェイスにより、構造化された出力が保証されます<br> このインターフェイスを使用すると、シリアル化ロジックをカスタマイズし、オブジェクトを配列出力に変換することができます。これは、従来のGetArrayCopy()または手動配列の構築よりもエレガントです。
ロジックのフォーマット<br> たとえば、 avatar_urlフィールドのスプライシングロジックは、コントローラーまたはビューレイヤーでの処理の詳細を回避する匿名クラス内にきれいに包まれています。
伝統的な方法は次のように書かれているかもしれません:
<code> echo json_encode(['id' => $ user-> id、 'name' => $ user-> name、 'avatar_url' => 'https://gitbox.net/uploads/avatars/'。$ user-> avatar、]); </code>コードの行の数は類似していますが、出力フィールドが多く、ロジックが複雑である場合、匿名クラスはより構造化された多重化ポテンシャルを持ちます。特に、匿名のクラスは、関数でさらに抽象的にカプセル化して、一般的なプレゼンター層を形成することができます。
匿名のクラス + jSonserializableは、一時的なデータカプセル化と出力の小規模な使用に理想的な組み合わせです。
プロジェクトに多数のDTO要件がある場合は、特殊なクラスまたは自動化ツール(Symfony Serializer、Laravel Resourceなど)の使用を検討してください。
匿名のクラスは虐待を避けています。匿名のクラスは柔軟ですが、複雑な動作を備えたロジックや再利用する必要があるロジックに対処するのに適していません。