什么是更好的stdClass或(对象)数组来存储相关数据?

2022-08-30 22:17:00

很长一段时间以来,我一直在使用数组来存储相关字段。如果我想有相关的用户字段,我使用了:

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

是其中一个比另一个更好,按照性能和风格的顺序,或者你可以模糊地使用任何你想要的东西?

谢谢!

更新:我同意所有的评论,这根本不是OOP,只是将相关数据分组到一个结构中。我$user的例子不是最好的,因为它是使用具有方法,属性,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 相比,转换数组非常有效。

但此测试仅计量执行时间。它不计量内存。

附言:我只使用phpFiddle来共享代码。测试是在我的本地PC上完成的。


答案 2

尝试调查问题,这里测试每个做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


推荐