Использование массивов VS-объектов для хранения данных

Возможный дубликат:
Когда следует использовать stdClass и когда следует использовать массив в коде php5 oo?

Каковы преимущества использования одной из двух структур над другой?

// array $user['name'] = 'Emanuil'; // object $user->name = 'Emanuil'; 

Solutions Collecting From Web of "Использование массивов VS-объектов для хранения данных"

Массивы

  • Существует array_* функций array_* которые могут работать на массивах, большинство из которых очень быстрые.
  • По умолчанию они переходят по значению (копируются вокруг)
  • Легкий / Простой (изменяет только локальную переменную эффекта, меньше думать)
  • Часто используется для сборки после данных (данные, которые не изменяются)
  • Все данные являются общедоступными
  • Немного менее ресурсоемкий

Объекты

  • Методы могут использоваться для более строгих данных. (IE проверяет, что поле соответствует формату)
  • Подкласс (сокращение дублирования кода)
  • По умолчанию они передаются по ссылке
  • Изменения в данных могут иметь каскадные эффекты ( __get , __set и т. Д.)
  • Часто используется для данных, которые являются более изменчивыми
  • Может защищать данные извне через функции и защищенные / частные переменные
  • Тип функции: намек на объекты более гибкий (различный тип для разных классов)

Что делаешь? Ни одна структура не лучше во всем, поэтому оба существуют. Так что это действительно зависит от вашего набора проблем, который «лучше». И даже тогда это может быть просто случай, который вы предпочитаете. Много архитектуры и дизайна кода – это личные предпочтения и стиль.

Теперь, в общем, есть только один раз, когда я использовал бы объект без stdclass ( stdclass или пользовательский определенный) над массивом. Вот если мне нужно будет передавать эти данные по многим параметрам и изменять их в разных местах. С массивом вам нужно будет передать его по ссылке, которая становится громоздкой и может привести к источникам ошибок … С объектом он по умолчанию передается как ссылка на объект (не ссылка на переменную, а указатель на тот же объект). Итак, с массивом вам нужно будет сделать что-то вроде:

 function doSomething($inVar, array &$inOutArray) { $inOutArray['bar'] = 'baz'; } 

Для каждой функции, которая модифицирует (или может изменять) массив.

В то время как с объектом вы можете просто сделать:

 function doSomething($inVar, $object) { $object->bar = 'baz'; } 

Это короче (конечно, только один символ, но это один символ везде, где вы, возможно, захотите изменить массив). Он менее подвержен ошибкам, поскольку, если вы позже сделаете $object = new Something() , он не изменит исходный объект (поскольку он не является ссылкой на переменные) …

Единственный аргумент в том, что он немного менее читабельен, так как & показывает вам явно, что вы намерены изменить эту входную переменную. Но если вы понимаете, как работают объекты на PHP 5, вы не должны быть застигнуты врасплох (и, следовательно, это приемлемый компромисс в моем сознании) …

Просто выполните простой тест:

 $ts_o = microtime(true); for($i=0;$i<=1000;$i++) { new stdClass(); } $total_object = microtime(true) - $ts_o; 

Против:

 $ts_a = microtime(true); for($i=0;$i<=1000;$i++) { array(); } $total_array = microtime(true) - $ts_a; 

И вычислить его результаты.

 echo 'Object: ' . $total_object . ' / Array: ' . $total_array; 

Результаты: Объект: 0.002635 / Массив: 0.001243

Как вы видите, массивы быстрее в скорости, в среднем 46,6%.

Но когда вы начинаете добавлять переменные, они внезапно поворачиваются:

 $ts_o = microtime(true); for($i=0;$i<=1000;$i++) { $var = new stdClass(); $var->booleon = true; } $total_object = microtime(true) - $ts_o; unset($var); $ts_a = microtime(true); for($i=0;$i<=1000;$i++) { $var = array(); $var['booleon'] = true; } $total_array = microtime(true) - $ts_a; echo 'Object: ' . ($total_object) . ' / Array: ' . $total_array; с $ts_o = microtime(true); for($i=0;$i<=1000;$i++) { $var = new stdClass(); $var->booleon = true; } $total_object = microtime(true) - $ts_o; unset($var); $ts_a = microtime(true); for($i=0;$i<=1000;$i++) { $var = array(); $var['booleon'] = true; } $total_array = microtime(true) - $ts_a; echo 'Object: ' . ($total_object) . ' / Array: ' . $total_array; 

Новые результаты: 0,0037809 / Массив: 0,0046189

Есть несколько тестов, которые вам нужно будет сделать, затем найдите свой средний / режим в конце теста, чтобы найти тот, который действительно является лучшим объектом.

Вы можете выполнить тест на память, выполнив функцию memory_get_usage : http://php.net/manual/en/function.memory-get-usage.php с теми же принципами.