Что лучше хранить массив stdClass или (object) для хранения связанных данных?

Я использую массивы для хранения связанных полей в течение длительного времени. Если бы я хотел иметь связанные поля пользователя, я использовал:

$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'
);

Один из них лучше, чем другой, в порядке производительности и стиля, или вы можете использовать все, что хотите, нечетко?

Спасибо!

Update: Я согласен со всеми комментариями, это вовсе не ООП, а просто связанные с ними данные, сгруппированные в структуру. Мой пользовательский пример не самый лучший, потому что это типичный пример использования классов с методом, свойствами, blablabla... Я спросил, потому что у меня много конфигурационных структур, таких как "initTable", и мне нужно что-то вроде:

$table => page => init => 1
               => end  => 25
          sort => field => name
               => order => asc

и т.д., и я хочу знать, что лучше получить страницу init:

$table->page->init **OR** $table['page']['init']

Ответ 1

Основываясь на небольшом тесте (http://phpfiddle.org/lite/code/cz0-hyf), я могу сказать, что использование "new stdClass()" примерно в 3 раза медленнее, чем другие варианты.

Это странно, но отливка массива выполняется очень эффективно по сравнению с stdClass.

Но этот тест измеряет только время выполнения. Он не измеряет память.

P.S. Я использовал phpFiddle только для совместного использования кода. Тест проводился на моем локальном ПК.

Ответ 2

Попробуйте исследовать проблему, здесь тест выполняется каждый раз 1000 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 со многими процентами. Но я бы не стал считать это общим универсальным правилом или законом.

Ответ 3

Я не думаю, что перемещение массива в стандартный объект изменит ситуацию. Кроме того, вы больше не можете использовать большинство array_*.
Я не вижу никаких преимуществ, используя динамический объект над индексированным массивом.

В этом случае я бы создал класс для каждого элемента и свойств, которые вам нужны.

class User
{
    protected $id;
    protected $name;

    public function __construct($id = null, $name = null)
    {
        $this->id   = $id;
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;
    }
}

С такой конструкцией вы точно знаете, какие параметры у вас есть.

$user  = new User(21, 'Foo');
echo $user->getName(); // Foo

$blank = new User(22);
echo $blank->getName(); // NULL

Нет ошибок, нет проверки.
С помощью array или stdClass у вас будет что-то вроде этого

$user = array('id' => 21, 'name' => 'Foo');
echo $user['name']; // Foo

$blank = array('id' => 22);
echo $blank['name']; // NOTICE: Undefined offset
echo isset($blank['name']) ? $blank['name'] : null; // NULL

Для такого поведения, имея твердый объект, в котором вы знаете, интерфейс легче поддерживать и крутить.