Je ne pense pas qu'il est raisonnable avantage de l'utilisation d'un stdClass sur un tableau aussi longtemps que votre seul but est de revenir arbitraires multiples types de données à partir d'un appel de fonction.
Puisque vous ne pouvez pas techniquement retourner plusieurs valeurs en mode natif, vous avez à utiliser un récipient qui peut contenir tous les autres types de données disponibles dans PHP. Que serait un objet ou un tableau.
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); }
Tout ce qui précède travail. Le tableau n'est qu'une infime fraction négligeable plus rapide et moins de travail de type. Il a aussi clairement défini le but en revanche pour le générique stdClass (qui est un peu wishywashy, n'est-il pas). Deux seulement ont implicite de l'interface, de sorte que vous avez à regarder les docs ou le corps de la fonction pour savoir ce qu'ils contiennent.
Si vous souhaitez utiliser des objets à n'importe quel coût, vous pouvez utiliser ArrayObject ou SplFixedArray, mais si vous regardez leurs Api voulez-vous dire que vous avez besoin de leur fonctionnalité pour la simple tâche de retourner aléatoire de plusieurs valeurs? Je ne le pense pas. Ne vous méprenez pas: si vous souhaitez utiliser stdClass, puis l'utiliser. C'est pas comme si elle allait se briser quoi que ce soit. Mais vous aussi, vous ne gagnerait rien. Pour ajouter au moins un certain avantage, vous pouvez créer une classe nommée ReturnValues pour cela.
Pourrait être un simple marquage de la classe
class ReturnValues {}
ou quelque chose de plus fonctionnel
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); }
}
Accordé, il ne fait pas beaucoup et d'obtenir les valeurs d', il est toujours fait par le biais d'un implict interface, mais au moins la classe a une responsabilité clairement définie maintenant. Vous pouvez étendre à partir de cette classe pour créer ReturnValue objets pour des opérations particulières et de donner à ces une interface explicite:
class FooReturnValues extends ReturnValues
{
public function getFoo() { return $this->values['foo']; }
public function getBar() { return $this->values['foo']; }
}
Désormais, le développeur a juste à regarder l'API pour savoir lequel de multiples valeurs foo() sera de retour. Bien sûr, avoir à écrire de béton ReturnValue classes pour chaque opération qui peut renvoyer plusieurs valeurs peuvent devenir rapidement fastidieux. Et personnellement, je trouve ce overengineered de l'objectif initial.
De toute façon, l'espoir qui fait du sens.