Что лучше хранить массив 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
Для такого поведения, имея твердый объект, в котором вы знаете, интерфейс легче поддерживать и крутить.