2010-09-14 4 views
12

Можно создать дубликат:
When should I use stdClass and when should I use an array in php5 oo code ??Использование массивов VS объектов для хранения данных

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

// array 
$user['name'] = 'Emanuil'; 

// object 
$user->name = 'Emanuil'; 
+2

Почему вы говорите, что 1 лучше, чем 2? Я лично не согласен с этим заявлением. Можете ли вы объяснить, почему вы думаете, что 1 лучше, чем 2? Мы говорим об эффективности, потреблении памяти, практике кодирования? Посмотрите также: http://particletree.com/notebook/object-oriented-php-memory-concerns/. – Chris

+0

Просто подсказка: возможно, массивы потребляют меньше ресурсов. – fabrik

+0

@ Крис: Кажется, я где-то читал, что если вам нужна структура, чтобы просто хранить данные, тогда 1 - это предпочтительный способ. –

ответ

27

Массивы

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

Объекты

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

Просто запустите простой тест:

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

Versus:

$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% Infact.

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

$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 с теми же принципами.

+8

соображения производительности IMO shoudnt будут принимать решение о том, следует ли используйте тот или иной. – Gordon

+1

Тестовая запись на них. Протестируйте их к функциям. Тестирование проходит по ссылке и модифицирует их внутри функции (подсказка, с объектами, которые вам не нужно передавать по ссылке, чтобы изменить внутри функции). Создание, вероятно, наименее часто выполняется с помощью массивов или объектов. Кого волнует, если они дешевы для создания, если они дороги в использовании ... И кроме того, вы говорите о разнице в «1x10^-6» ... Если вы беспокоитесь об этом небольшом выигрыше, вы тратя ваше время. Помните: «Преждевременная оптимизация - это корень всего зла» ... – ircmaxell

+0

Но производительность в целом является важной частью любого успешного приложения и должна быть адресована всякий раз, когда даются рекомендации/реализация! – RobertPitt

5

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

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

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

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

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

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

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

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

Смежные вопросы