Что лучше хранить массив 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' ); 

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

Благодаря!

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

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

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

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

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

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

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

PS Я использовал 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_* .
Я не вижу никаких преимуществ, используя динамический объект над индексированным массивом.

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

 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 

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