Inmitten einer Phase großer Umgestaltungen bei der Arbeit möchte ich stdClass ***** einführen, um Daten von Funktionen zurückzugeben, und ich versuche, nicht-subjektive Argumente zu finden, um meine Entscheidung zu unterstützen.
Gibt es Situationen, in denen es am besten ist, eine anstelle der anderen zu verwenden?
Welche Vorteile hätte ich, wenn ich stdClass anstelle von Arrays verwenden würde?
Einige würden sagen, dass Funktionen so klein und spezifisch sein müssen, um einen einzelnen Wert zurückgeben zu können. Meine Entscheidung, stdClass zu verwenden, ist zeitlich begrenzt, da ich hoffe, langfristig die richtigen Wertobjekte für jeden Prozess zu finden.
Antworten:
Der übliche Ansatz ist
Verwenden Sie Objekte, wenn Sie eine definierte Datenstruktur mit festen Verzweigungen zurückgeben:
$person -> name = "John" -> surname = "Miller" -> address = "123 Fake St"
Verwenden Sie Arrays, wenn Sie eine Liste zurückgeben:
"John Miller" "Peter Miller" "Josh Swanson" "Harry Miller"
Verwenden Sie ein Array von Objekten, wenn Sie eine Liste strukturierter Informationen zurückgeben:
$person[0] -> name = "John" -> surname = "Miller" -> address = "123 Fake St" $person[1] -> name = "Peter" -> surname = "Miller" -> address = "345 High St"
Objekte sind nicht für Datenlisten geeignet, da Sie immer einen Schlüssel benötigen, um sie zu adressieren. Arrays können beide Funktionen erfüllen - sie enthalten beliebige Listen und eine Datenstruktur.
Daher können Sie für das erste und dritte Beispiel assoziative Arrays über Objekten verwenden, wenn Sie möchten. Ich würde sagen, das ist wirklich nur eine Frage des Stils und der Vorlieben.
@Deceze macht eine Reihe guter Punkte, wann ein Objekt verwendet werden soll (Validierung, Typprüfung und zukünftige Methoden).
quelle
Die Verwendung
stdClass
der gleichen Funktion wie ein Array ist meiner Meinung nach nicht sehr nützlich, sondern erhöht lediglich den Overhead eines Objekts ohne wirklichen Nutzen. Sie verpassen auch viele nützliche Array-Funktionen (zarray_intersect
. B. ). Sie sollten mindestens eine eigene Klasse erstellen, um die Typprüfung zu aktivieren, oder dem Objekt Methoden hinzufügen, damit sich die Verwendung eines Objekts lohnt.quelle
Ich glaube nicht, dass die Verwendung einer stdClass gegenüber einem Array einen vernünftigen Vorteil hat, solange Sie nur die Absicht haben , mehrere beliebige Datentypen aus einem Funktionsaufruf zurückzugeben .
Da Sie technisch gesehen nicht mehrere Werte nativ zurückgeben können, müssen Sie einen Container verwenden, der alle anderen in PHP verfügbaren Datentypen enthalten kann. Das wäre entweder ein Objekt oder ein Array.
function fn1() { return array(1,2); } function fn2() { return array('one' => 1, 'two' => 2); } function fn3() { return (object) array(1,2); } function fn4() { return (object) array('one' => 1, 'two' => 2); }
All das würde funktionieren. Das Array ist ein winziger vernachlässigbarer Bruchteil schneller und weniger zu tippen. Es hat auch einen klar definierten Zweck im Gegensatz zur generischen stdClass (die ein bisschen wunschgemäß ist, nicht wahr?). Beide haben nur eine implizite Schnittstelle, daher müssen Sie sich die Dokumente oder den Funktionskörper ansehen, um zu wissen, was sie enthalten.
Wenn Sie Objekte um jeden Preis verwenden möchten , können Sie ArrayObject oder SplFixedArray verwenden . Wenn Sie sich jedoch deren APIs ansehen, würden Sie sagen, dass Sie deren Funktionalität für die einfache Aufgabe benötigen, zufällige Mehrfachwerte zurückzugeben? Das glaube ich nicht. Versteh mich aber nicht falsch: Wenn du stdClass verwenden willst, dann benutze es. Es ist nicht so, als würde es irgendetwas kaputt machen. Aber Sie würden auch nichts gewinnen. Um zumindest einige Vorteile hinzuzufügen, können Sie hierfür eine separate Klasse mit dem Namen ReturnValues erstellen.
Könnte eine einfache Tagging-Klasse sein
class ReturnValues {}
oder etwas funktionaler
class ReturnValues implements Countable { protected $values; public function __construct() { $this->values = func_get_args(); } public function __get($key) return $this->values[$key]; } public function count() { return count($this->values); } }
Zugegeben, es macht nicht viel und das Herausholen der Werte erfolgt immer noch über eine implizite Schnittstelle, aber zumindest hat die Klasse jetzt eine klarere Verantwortung. Sie können diese Klasse erweitern, um ReturnValue-Objekte für bestimmte Vorgänge zu erstellen und diesen eine explizite Schnittstelle zu geben:
class FooReturnValues extends ReturnValues { public function getFoo() { return $this->values['foo']; } public function getBar() { return $this->values['foo']; } }
Jetzt muss sich der Entwickler nur noch die API ansehen, um zu wissen, welche mehreren Werte foo () zurückgeben werden. Das Schreiben konkreter ReturnValue-Klassen für jede Operation, die möglicherweise mehrere Werte zurückgibt, kann natürlich schnell mühsam werden. Und ich persönlich finde das für den ursprünglichen Zweck überarbeitet.
Wie auch immer, hoffe das macht Sinn.
quelle
stdClass
es kaum mehr als eine alternative Darstellung eines assoziativen Arrays ist.$options = ['a'=>'str', 'b'=>'str'];
ist jedoch fast genauso elegant und ermöglicht die vielen nativen / leistungsstarken Funktionen, die für Arrays erstellt wurden. Ich bleibe also bei Arrays, es sei denn, ich muss einer JSON-Struktur entsprechen.Nun, es gibt 3 Unterschiede:
greetz
back2dos
quelle
Das einzige ZIEL Vertrauensvotum, das ich finden kann, ist:
json_decode
Verwendet standardmäßig stdClass, daher sollten wir Sterblichen im Userland stdClass für ähnliche Situationen verwenden.quelle
json_decode($json, true);
wenn Sie Arrays anstelle von Objekten erhalten möchtenIch finde stdClass-Objekte über Arrays nützlich, wenn ich meinen Code sauber und etwas satzartig lesbar halten muss. Nehmen wir zum Beispiel eine Funktion,
getProperties()
die eine Reihe von Eigenschaften zurückgibt, beispielsweise Daten über eine Person (Name, Alter, Geschlecht). Wenn SiegetProperties()
ein assoziatives Array zurückgeben würden, wenn Sie eine der zurückgegebenen Eigenschaften verwenden möchten, würden Sie zwei Anweisungen schreiben:$data = getProperties(); echo $data['name'];
Wenn
getProperties()
Sie andererseits eine stdClass zurückgeben, können Sie dies in nur einer Anweisung schreiben:echo getProperties()->name;
quelle
echo getProperties()['name'];
3v4l.org/t6i0rIn Tests von Array gegen Standardklasse ist die Art und Weise, wie PHP mit dynamischen Eigenschaften umgeht, langsamer als bei assoziativen Arrays. Ich sage dies nicht, um die Mikrooptimierung zu argumentieren, sondern wenn Sie dies tun, ist es besser, eine Datenklasse ohne Methoden zu definieren und öffentliche Eigenschaften festzulegen. Besonders wenn Sie PHP 5.4+ verwenden. Unter der Haube werden definierte Eigenschaften direkt auf ein AC-Array ohne Hashtabelle abgebildet, während dynamische Eigenschaften eine Hash-Tabelle verwenden müssen.
Dies hat den zusätzlichen Vorteil, dass es später zu einer vollständigen Klasse wird, ohne dass die Benutzeroberfläche grundlegend überarbeitet werden muss.
quelle