Betrachten Sie das folgende Szenario: Sie haben ein Benutzermodell $ Benutzer , das viele Felder wie ID, Name, E -Mail, Kennwort -Hash, Registrierungszeit usw. enthält. Wenn Sie eine Schnittstelle zur externen Welt bereitstellen, möchten Sie möglicherweise nur einen Teil der Felder wie ID und Name zurückgeben, und müssen möglicherweise auch bestimmte Felder verarbeiten, z. B. URLs oder Formatierungen. Um zu vermeiden, dass die Logik des Modells selbst kontaminiert wird und gleichzeitig der Code präzise und klare, sind anonyme Klassen nützlich.
Hier finden Sie ein Beispiel mit anonymen Klassen und jsonserialisierbaren Implementierung:
<Code> <? Php $ user = (Objekt) [
'id' => 101,
'Name' => 'Alice',
'avatar' => 'avatar101.jpg',
];
Function Presentuser (Objekt $ Benutzer): JsonSerializable {
Neue Klasse zurückgeben ($ user) implementiert JsonSerializable {
privates Objekt $ user;
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,
];
}
};
}
Header ('Inhaltstyp: Anwendung/JSON');
echo json_encode (jensuer ($ user), json_pretty_print);
</code>
Anonyme Klassen sind eng an den Kontext gebunden <br> Anonyme Klassen erfassen $ User -Objekte über Konstruktoren, die nur in dieser Verwendung vorhanden sind, wodurch die Redundanz von Klassendefinitionen verringert wird.
JsonSerializable Interface sorgt für die strukturierte Ausgabe <br> Mit dieser Schnittstelle können Sie die Serialisierungslogik anpassen, Objekte in die Array -Ausgabe umwandeln, die eleganter ist als herkömmliche GetArrayCopy () oder manuelle Array -Konstruktion.
Logik der Kapselung Formatierung <br> Beispielsweise ist die Spleißlogik des Feldes avatar_url in anonymen Klassen sauber eingewickelt, wodurch die Verarbeitungsdetails in der Controller oder in der Schicht angezeigt werden.
Der traditionelle Weg könnte so geschrieben werden:
<Code> echo json_encode (['id' => $ user-> id, 'name' => $ user-> name, 'avatar_url' => 'https://gitbox.net/uploads/avatars/'. $ user-> avatar,]); </code>Obwohl die Anzahl der Codezeilen ähnlich ist, hat die anonyme Klasse, wenn die Ausgabefelder viele sind und die Logik komplex ist, strukturierteres und multiplexes Potenzial, insbesondere die anonyme Klasse kann in Funktionen weiter abstrakt eingekapselt werden, um eine allgemeine Moderatorschicht zu bilden.
Anonymous Class + JsonSserializable ist die ideale Kombination für die temporäre Datenverkapselung und die Verwendung von Ausgabe in kleinem Maßstab.
Wenn es eine große Anzahl von DTO -Anforderungen im Projekt gibt, erwägen Sie, spezialisierte Klassen oder Automatisierungswerkzeuge (wie Symfony Serializer, Laravel Resource) zu verwenden.
Anonyme Klassen vermeiden Missbrauch: Obwohl anonyme Klassen flexibel sind, sind sie nicht für den Umgang mit Logik geeignet, die komplexe Verhaltensweisen aufweist oder wiederverwendet werden müssen.