Подтвердить что ты не робот

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

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

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

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

// object
$user->name = 'Emanuil';
4b9b3361

Ответ 1

Массивы

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

Объекты

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

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

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

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