Когда я должен использовать stdClass и когда я должен использовать массив в php oo код?

В середине периода больших рефакторингов на работе я хочу представить stdClass ***** как способ возвратить данные из функций, и я пытаюсь найти, что non-subjectives аргументы поддерживают мое решение.

Есть ли какие-либо ситуации, когда было бы лучше использовать один вместо другого??

Какую пользу я извлек бы для использования stdClass вместо массивов??


Некоторые сказали бы, что функции должны быть так же мало и конкретны, чтобы смочь возвратить одно единственное значение. Мое решение использовать stdClass является временным, поскольку я надеюсь найти правильные Объекты Значения для каждого процесса на длительном периоде.

68
задан Habeeb Perwad 11 January 2013 в 12:17
поделиться

4 ответа

Обычный подход -

  • Использовать объекты при возврате определенной структуры данных с фиксированными ветвями:

      $ person
     -> name = "Джон"
     -> фамилия = "Миллер"
     -> address = "123 Fake St"
    
  • Используйте массивы при возврате списка:

      «Джон Миллер»
     "Питер Миллер"
     "Джош Свонсон"
     "Гарри Миллер"
    
  • Используйте массив объектов при возврате списка структурированной информации:

      $ person [0]
     -> name = "Джон"
     -> фамилия = "Миллер"
     -> address = "123 Fake St"
    
     $ человек [1]
     -> name = "Питер"
     -> фамилия = "Миллер"
     -> address = "345 High St"
    

Объекты не подходят для хранения списков данных, потому что вам всегда нужен ключ для их адресации. Массивы могут выполнять обе функции - содержать произвольные списки и структуру данных.

Следовательно, вы можете использовать ассоциативные массивы над объектами для первого и третьего примеров, если хотите. Я бы сказал, что это действительно вопрос стиля и предпочтений.

@Deceze дает несколько хороших советов о том, когда использовать объект (проверка, проверка типов и будущие методы).

60
ответ дан 24 November 2019 в 14:15
поделиться

Ну, есть 3 различия:

  • у них есть идентичность. Вот почему по умолчанию для передачи аргументов массива используется вызов по значению, а для объектов вызов путем совместного использования.
  • есть семантическое различие. Если вы используете объект, любой, кто читает код, понимает, что значение представляет модель какую-то привилегию, в то время как массив должен действовать как коллекция или карта
  • И последнее, но не менее важное, рефакторинг становится значительно проще. Если вы хотите использовать конкретный класс, а не stdClass, все, что вам нужно сделать, это создать экземпляр другого класса. Что также позволяет добавлять методы.

привет
back2dos

4
ответ дан 24 November 2019 в 14:15
поделиться

Использование stdClass для выполнения той же функции, что и массив, не очень полезно IMHO, это просто добавляет накладные расходы на объект без какой-либо реальной пользы. Вы также упускаете многие полезные функции массивов (например, array_intersect). Вам следует по крайней мере создать свой собственный класс, чтобы включить проверку типов, или добавить методы к объекту, чтобы было целесообразно использовать объект.

41
ответ дан 24 November 2019 в 14:15
поделиться

Я не думаю, что есть какое-либо разумное преимущество использования 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 для каждой операции, которая может возвращать несколько значений, может быстро стать утомительной. И лично я считаю, что это излишне спроектировано для первоначальной цели.

В любом случае, надеюсь, это имеет смысл.

18
ответ дан 24 November 2019 в 14:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: