我认为,只要你的唯一目的是从函数调用中返回多个任意数据类型,使用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相比,它还有一个明确的目的(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类可能会很快变得乏味。就个人而言,我认为这对于最初的目的来说过于工程化。
无论如何,希望这有任何意义。