関数呼び出しから複数の任意のデータ型を返すことが唯一の目的である限り、配列よりもstdClassを使用することの合理的な利点はないと思います。
技術的には複数の値をネイティブに返すことはできないため、PHPで使用可能な他のすべてのデータ型を保持できるコンテナーを使用する必要があります。これは、オブジェクトまたは配列のいずれかになります。
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); }
上記のすべてが機能します。配列はごくわずかな分数であり、入力する作業が少なくて済みます。また、一般的なstdClassとは対照的に、明確に定義された目的があります(これは少し意地悪ですが、そうではありません)。どちらも暗黙的なインターフェースしかないため、ドキュメントまたは関数本体を調べて、それらに何が含まれるかを知る必要があります。
とにかくオブジェクトを使用したい場合は、ArrayObjectまたはSplFixedArrayを使用できますが、それらのAPIを見ると、ランダムな複数の値を返すという単純なタスクのための機能が必要だと思いますか?私はそうは思わない。ただし、誤解しないでください。stdClassを使用する場合は、それを使用してください。それが何かを壊すようなものではありません。しかし、あなたも何も得られないでしょう。少なくともいくつかの利点を追加するために、このためにReturnValuesという名前の別のクラスを作成できます。
単純なタグ付けクラスである可能性があります
class ReturnValues {}
またはもっと機能的なもの
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); }
}
確かに、それはあまり機能せず、そこから値を取得することは、暗黙のインターフェースを介して行われますが、少なくともクラスには、より明確に定義された責任があります。このクラスから拡張して、特定の操作用のReturnValueオブジェクトを作成し、それらに明示的なインターフェースを与えることができます。
class FooReturnValues extends ReturnValues
{
public function getFoo() { return $this->values['foo']; }
public function getBar() { return $this->values['foo']; }
}
これで、開発者はAPIを調べて、foo()が返す複数の値を知る必要があります。もちろん、複数の値を返す可能性のあるすべての操作に対して具体的なReturnValueクラスを作成する必要があると、すぐに面倒になる可能性があります。そして個人的には、これは当初の目的のために過剰に設計されていると思います。
とにかく、それが理にかなっていることを願っています。