Я не думаю, что есть разумное преимущество использования 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); }
}
Конечно, это не так уж и много, и получение значений из него по-прежнему осуществляется через интерфейс Implict, но, по крайней мере, теперь класс имеет более четко определенную ответственность. Вы можете расширить этот класс для создания объектов ReturnValue для определенных операций и дать им явный интерфейс:
class FooReturnValues extends ReturnValues
{
public function getFoo() { return $this->values['foo']; }
public function getBar() { return $this->values['foo']; }
}
Теперь разработчику просто нужно взглянуть на API, чтобы узнать, какие множественные значения вернет foo (). Конечно, необходимость писать конкретные классы ReturnValue для каждой операции, которая может возвращать несколько значений, может быстро стать утомительной. И лично я нахожу это слишком сильным для первоначальной цели.
Во всяком случае, надеюсь, что это имеет какой-то смысл.