Standardobjekt aus leerem Wert in PHP erstellen?
On Dezember 1, 2020 by adminBetrachten Sie den folgenden Code.
$car = (object)[ "general" => [ "interior" => [ "seats" => "destroyed" ] ] ]; $exteriorProperties = [ "hood" => "shiny", "windows" => "dirty" ]; foreach($exteriorProperties as $key => $prop){ $car->{"other"}->{"exterior"}->{$key} = $prop; }
Dies ist ein Szenario, in dem I „d Sie möchten einem Objekt Eigenschaften hinzufügen, die mehrere Ebenen tief sind, während Sie einige andere Daten durchlaufen. Wenn es nicht vorhanden ist, wird es nur erstellt, wenn dies der Fall ist, wird es überschrieben. PERFEKT!
Dies wird leider die Warnung auslösen:
Standardobjekt aus leerem Wert erstellen
Ich könnte das Problem beheben, indem ich zuerst überprüfe, ob die Eigenschaft wie folgt existiert:
foreach($exteriorProperties as $key => $prop){ if(!isset($car->other)) $car->other = (object)[]; if(!isset($car->other->exterior)) $car->other->exterior = (object)[]; $car->other->exterior->{$key} = $prop; }
Dies ist nicht mein Ideal Lösung. Ich frage mich, ob es eine elegantere Lösung gibt. Derzeit verwende ich Folgendes:
@$car->{"other"}->{"exterior"}->{$key} = $prop;
, um die Warnungen zu unterdrücken, aber ich mache mir Sorgen um die zukünftige Kompatibilität.
Tut dies Hat jemand eine elegantere Lösung für dieses Szenario?
Kommentare
- Verwenden Sie ' keine Arrays als Die Antwort unten schlägt vor, das Objekt richtig zu verwenden. Arrays sind nur für lokalen Code geeignet. Wenn sie außerhalb einer Datei oder Klasse freigegeben werden, schreiben Sie Schlüssel manuell, müssen sie sich merken, verpassen ein oder zwei, Tippfehler. Gute IDE mit automatischer Vervollständigung und Objekte mit Getter / Setter sind eine glückliche Entwicklungswelt.
Antwort
Ja, Verwenden Sie Arrays.
$car = [ "general" => [ "interior" => [ "seats" => "destroyed" ] ] ]; $exteriorProperties = [ "hood" => "shiny", "windows" => "dirty" ]; foreach($exteriorProperties as $key => $prop){ $car["other"]["exterior"][$key] = $prop; } $car = (object) $car;
Bei der Objektkonvertierung wird jedoch nur das äußerste Array konvertiert. Die verschachtelten Arrays sind immer noch Arrays.
\is_array($car->general); // true
Warum müssen es überhaupt formlose Objekte sein? Entweder Klassen für diese Objekte definieren oder sie als Arrays behandeln ist die einfache Antwort.
Übrigens $car->{"other"}
ist eine wirklich seltsame Art, $car->other
…
Kommentare
- Ich nehme an, Sie ' haben Recht, ich habe nur Recht Ich hasse es, die ganze Zeit in Arrays eingeschlossen zu sein. Die
$car->{'other'}
ist, weil die meisten meiner Eigenschaftsschlüssel von Zeichenfolgenvariablen stammen. Beispiel:$car->{$var1}->{$var2}
Antwort
Ja, Sie können dies vermeiden die iterierten bedingten Operationen durch Verarbeiten aller Daten als Arrays.
Code: ( Demo )
$car = json_decode( json_encode( array_replace_recursive( (array)$car, ["other" => ["exterior" => $exteriorProperties]] ) ) );
Wenn Sie nur die oberste Ebene vom Objekttyp zum Array-Typ abdecken, können Sie sie einfach mit (array)
umwandeln. Wenn Sie alle Ebenen konvertieren müssen – json codiert das gesamte Objekt, dekodieren Sie diese Zeichenfolge in ein Array. Wenn Sie mit der Verarbeitung fertig sind, verwenden Sie die Funktionen json_
, um die Daten auf den Objekttyp zurückzusetzen.
Ich finde das immer noch etwas klobig (vielleicht genauso klobig wie Ihre bedingter Ansatz). Der Vorteil in der obigen ist in der Rekursion; Wenn sich Ihre Datentiefe ändert, müssen Sie das Verarbeitungsskript nicht ändern. Fragen Sie sich, ob Sie tatsächlich ein Objekt verwenden müssen. Wenn die Codierung mit einem anderen Datentyp vereinfacht wird, überdenken Sie möglicherweise / refactor.
Ps Schreiben Sie den stfu-Operator (@
) definitiv nicht in Ihren Code. In fast allen Implementierungen ist die Technik vermeidbar (dies ist einer dieser Fälle) und Projekte mit einer solchen Syntax werden von erfahrenen Entwicklern als minderwertig eingestuft / angenommen.
Kommentare
- Danke, gute Bewertung. Ich konnte leider nur Objekte auswählen, da ein vorheriger Programmierer sie als solche codiert hat.
Schreibe einen Kommentar