Что лучше 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_*