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


What is better stdClass or (object) array to store related data?

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

$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

等等,我想知道什么更好获得初始化页面:

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

基于小测试 (http://phpfiddle.org/lite/code/cz0-hyf),我可以说使用"new stdClass()"比其他选项慢大约 3 倍。

这很奇怪,但与 stdClass 相比,强制转换数组非常有效。

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

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

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

没有错误,不再检查。
有了arraystdClass,你会有类似的东西

$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

对于这种行为,拥有一个您知道界面的固体对象更容易维护和扭曲。