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