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

时间:2013-09-05 15:40:25

标签: php oop 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'
);

其中一个比其他人更好,按性能和风格排序,还是你可以模糊地使用你想要的任何东西?

谢谢!

更新 我同意所有的评论,这根本不是OOP,只是将相关数据分组到一个结构中。我的$ user示例不是最好的,因为它是使用带有方法,属性,blablabla的类的典型示例...我问,因为我有很多配置结构,比如我们“initTable”,我想要类似的东西:< / p>

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

依此类推,我想知道获取init页面有什么好处:

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

3 个答案:

答案 0 :(得分:9)

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

奇怪的是,与stdClass相比,投射数组非常有效。

但是这个测试只计算执行时间。它不计量内存。

P.S。我只使用phpFiddle来共享代码。测试在我当地的PC上完成。

答案 1 :(得分:6)

尝试调查此问题,此处每项测试每次执行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。但我不指望它是一般的普遍规则或法律。

答案 2 :(得分:4)

我不认为将数组移动到标准对象会产生影响。除非您不能再使用大多数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

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