Considérez le scénario suivant: vous avez un utilisateur de modèle d'utilisateur $ qui contient de nombreux domaines tels que l'identifiant, le nom, le courrier électronique, le hachage de mot de passe, le temps d'enregistrement, etc. Lorsque vous fournissez une interface au monde extérieur, vous pouvez uniquement vouloir remettre une partie des champs, tels que l'identification et le nom, et peut également avoir besoin de traiter certains champs, tels que les champs d'épissage ou de mise en forme. Afin d'éviter de contaminer la logique du modèle lui-même, et en même temps, le code est concis et clair, les classes anonymes sont utiles.
Voici un exemple utilisant des classes anonymes et une implémentation JSonSerialisable :
<code> <? Php $ user = (objet) [
'id' => 101,
'name' => 'Alice',
'avatar' => 'avatar101.jpg',
]]
Function PresentUser (Object $ user): jsonSerializable {
return new class ($ user) implémente jsonSerializable {
Objet privé $ utilisateur;
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,
];
}
};
}
En-tête ('Content-Type: Application / JSON');
echo json_encode (présentUser ($ user), json_pretty_print);
</code>
Les classes anonymes sont étroitement liées au contexte <br> Les classes anonymes capturent $ les objets utilisateur via des constructeurs, qui n'existe que dans cette utilisation, réduisant la redondance des définitions de classe.
L'interface JSonSerializable garantit une sortie structurée <br> Cette interface vous permet de personnaliser la logique de sérialisation, de convertir des objets en sortie du tableau, qui est plus élégant que la construction de GetArrayCopy () ou manuelle traditionnelle.
Logique de formatage de l'encapsulation <br> Par exemple, la logique d'épissage du champ Avatar_Url est enveloppée proprement à l'intérieur des classes anonymes, en évitant le traitement des détails dans le contrôleur ou la couche de vue.
La manière traditionnelle pourrait être écrite comme ceci:
<code> echo json_encode (['id' => $ user-> id, 'name' => $ user-> name, 'avatar_url' => 'https://gitbox.net/uploads/avatars/'. $ user-> avatar,]); </code>Bien que le nombre de lignes de code soit similaire, si les champs de sortie sont nombreux et que la logique est complexe, la classe anonyme aura un potentiel plus structuré et multiplexé, en particulier la classe anonyme peut être encore abstraitement encapsulée dans les fonctions pour former une couche de présentateur générale.
Classe anonyme + JSonSerializable est la combinaison idéale pour l'encapsulation des données temporaire et l'utilisation à petite échelle de la sortie.
S'il existe un grand nombre d'exigences DTO dans le projet, envisagez d'utiliser des classes spécialisées ou des outils d'automatisation (tels que Symfony Serializer, Laravel Resource).
Les cours anonymes évitent les abus: bien que les cours anonymes soient flexibles, ils ne conviennent pas à la logique qui a des comportements complexes ou doit être réutilisée.