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.