Ich verwende ein Speichersystem eines Drittanbieters, das mir nur stdClass-Objekte zurückgibt, unabhängig davon, was ich aus einem unbekannten Grund eingebe. Ich bin gespannt, ob es eine Möglichkeit gibt, ein stdClass-Objekt in ein vollwertiges Objekt eines bestimmten Typs umzuwandeln.
Zum Beispiel etwas in der Art von:
//$stdClass is an stdClass instance
$converted = (BusinessClass) $stdClass;
Ich wandle die stdClass nur in ein Array um und füge sie dem BusinessClass-Konstruktor zu, aber vielleicht gibt es eine Möglichkeit, die ursprüngliche Klasse wiederherzustellen, die mir nicht bekannt ist.
Hinweis: Ich bin nicht an Antworten vom Typ "Ändern Sie Ihr Speichersystem" interessiert, da dies nicht der Punkt von Interesse ist. Bitte betrachten Sie es eher als eine akademische Frage zu den Sprachkapazitäten.
Prost
PDOStatement::fetchObject
diese Aufgabe erfüllt?Antworten:
Informationen zu möglichen Würfen finden Sie im Handbuch zum Typ Jonglieren .
Die erlaubten Abgüsse sind:
Sie müssten einen Mapper schreiben , der das Casting von stdClass in eine andere konkrete Klasse ausführt. Sollte nicht zu schwer sein.
Wenn Sie in einer hackigen Stimmung sind, können Sie den folgenden Code anpassen:
die ein Array an ein Objekt einer bestimmten Klasse pseudocastet. Dies funktioniert, indem zuerst das Array serialisiert und dann die serialisierten Daten so geändert werden, dass sie eine bestimmte Klasse darstellen. Das Ergebnis wird dann auf eine Instanz dieser Klasse unserialisiert. Aber wie gesagt, es ist hackisch, also erwarten Sie Nebenwirkungen.
Für Objekt zu Objekt wäre der Code
quelle
__PHP_Incomplete_Class
Mit dieser Methode erhalten Sie ein Objekt (mindestens ab PHP 5.6).fooBar
s (das private vonexample\Foo
und das öffentliche von stdClass). Stattdessen ersetzt es den Wert.Sie können die obige Funktion zum Umwandeln nicht ähnlicher Klassenobjekte verwenden (PHP> = 5.3).
BEISPIEL:
quelle
@Given the user :username has the id :id
in mein Feature aufnehmen und es mit Reflexionen in der$destination = new $destination();
die ausgetauscht werden kann,$destination = ( new ReflectionClass( $destination ) )->newInstanceWithoutConstructor();
wenn Sie den Aufruf des Konstruktors vermeiden müssen.So verschieben Sie alle vorhandenen Eigenschaften von a
stdClass
in ein neues Objekt mit einem angegebenen Klassennamen:Verwendung:
Ausgabe:
Dies ist aufgrund des
new
Operators begrenzt, da nicht bekannt ist, welche Parameter benötigt werden. Für Ihren Fall wahrscheinlich passend.quelle
Ich habe ein sehr ähnliches Problem. Die vereinfachte Reflexionslösung hat bei mir gut funktioniert:
quelle
Hoffe, dass jemand dies nützlich findet
quelle
Geänderte Funktion für Deep Casting (mit Rekursion)
quelle
Und noch ein Ansatz, der das Dekorationsmuster und die PHPs Magic Getter & Setter verwendet:
quelle
Übrigens: Das Konvertieren ist sehr wichtig, wenn Sie serialisiert sind, hauptsächlich weil die De-Serialisierung den Objekttyp aufteilt und in eine Standardklasse umgewandelt wird, einschließlich DateTime-Objekten.
Ich habe das Beispiel von @Jadrovski aktualisiert, jetzt sind Objekte und Arrays zulässig.
Beispiel
Beispiel Array
Code: (rekursiv). Ich weiß jedoch nicht, ob es mit Arrays rekursiv ist. Möglicherweise fehlt ein zusätzliches is_array
quelle
Erwägen Sie, BusinessClass eine neue Methode hinzuzufügen:
dann können Sie aus $ stdClass eine neue BusinessClass erstellen:
quelle
Noch ein Ansatz.
Folgendes ist jetzt dank der aktuellen PHP 7-Version möglich.
In diesem Beispiel wird $ foo als anonyme Klasse initialisiert, die ein Array oder stdClass als einzigen Parameter für den Konstruktor verwendet.
Schließlich durchlaufen wir alle im übergebenen Objekt enthaltenen Elemente und weisen sie dann dynamisch der Eigenschaft eines Objekts zu.
Um dieses Annäherungsereignis allgemeiner zu gestalten, können Sie eine Schnittstelle oder ein Merkmal schreiben, das Sie in jeder Klasse implementieren, in der Sie eine stdClass umwandeln möchten.
quelle
Konvertieren Sie es in ein Array, geben Sie das erste Element dieses Arrays zurück und setzen Sie den Rückgabeparameter auf diese Klasse. Jetzt sollten Sie die automatische Vervollständigung für diese Klasse erhalten, da sie als diese Klasse anstelle von stdclass neu konfiguriert wird.
quelle