Что лучше stdClass или (object) array для хранения связанных данных?
я использую массивы для хранения связанных полей в течение длительного времени. Если я хотел иметь связанные поля пользователя, я использовал:
$user = array(
'id' => 27
'name' => 'Pepe'
);
но в последнее время я много работаю с объектами, и мне больше нравится использовать $user->id вместо $user['id'].
мой вопрос: для достижения объектно-ориентированного стиля вы можете использовать stdClass:
$user = new stdClass();
$user->id = 27;
$user->name = 'Pepe';
или кастинг из массива
$user = (object) array(
'id' => 27
, 'name' => 'Pepe'
);
один из них лучше чем другие в порядке исполнения и стиль, или вы можете использовать все, что хотите неясно?
спасибо!
обновление: Я согласен со всеми комментариями, это вообще не ООП, это просто связанные данные, сгруппированные в структуру. Мой пример $user не лучший, потому что это типичный пример использования классов с method, properties, blablabla... Я спросил, потому что у меня много конфигурационных структур, таких как "initTable", и я хочу что-то вроде:
$table => page => init => 1
=> end => 25
sort => field => name
=> order => asc
и так далее, и я хочу знать, что лучше получить на странице init:
$table->page->init **OR** $table['page']['init']
3 ответов
на основе небольшого теста (http://phpfiddle.org/lite/code/cz0-hyf) я могу сказать, что использование "new stdClass ()" примерно в 3 раза медленнее, чем другие параметры.
странно, но литье массива выполняется очень эффективно по сравнению с stdClass.
но этот тест измеряет только время выполнения. Он не измеряет память.
P. S. Я использовал phpFiddle только для совместного использования кода. Тест был сделан на моем локальном ПК.
попробуйте исследовать проблему, здесь тест делает каждый 1.000.000 раз каждый:
$start = microtime(true);
for ($i=0;$i<1000000;$i++) {
$user = new stdClass();
$user->id = 27;
$user->name = 'Pepe';
}
$end = microtime(true);
echo $end - $start;
echo '<br><br>';
$start = microtime(true);
for ($i=0;$i<1000000;$i++) {
$user = (object) array(
'id' => 27,
'name' => 'Pepe'
);
}
$end = microtime(true);
echo $end - $start;
отчеты
0.75109791755676
0.51117610931396
так дом, в данном случае - кастинг из массива-самый быстрый способ сделать это. Бьет stdClass
со многими процентами. Но я бы не стал рассчитывать на это как на универсальное правило или закон.
Я не думаю, что перемещение массива в стандартный объект будет иметь значение. За исключением того, что вы не можете использовать большую часть array_*