使用数组VS对象存储数据

时间:2010-09-14 14:00:36

标签: php

  

可能重复:
  When should I use stdClass and when should I use an array in php5 oo code ??

使用两种结构中的一种比另一种结构有什么好处?

// array
$user['name'] = 'Emanuil';

// object
$user->name = 'Emanuil';

3 个答案:

答案 0 :(得分:32)

<强>阵列

  • array_*函数可以在数组上运行,其中大多数都非常快。
  • 默认情况下,它们会按值传递(复制)
  • 轻量级/简单(仅更改效果局部变量,更少考虑)
  • 通常用于构建一次数据(不会更改的数据)
  • 所有数据均为公开
  • 略微资源消耗较少

<强>物件

  • 方法可用于保持数据更严格。 (IE。检查字段是否符合格式)
  • 子类化(减少代码重复)
  • 默认情况下,它们通过引用传递
  • 对数据的更改可能会产生级联效应(__get__set等)
  • 通常用于更易变的数据
  • 可以通过函数和受保护/私有变量保护来自外部的数据
  • 对象的函数类型提示更灵活(不同类的不同typehint)

答案 1 :(得分:8)

只需运行一个简单的测试:

$ts_o = microtime(true);
for($i=0;$i<=1000;$i++)
{
    new stdClass();
}
$total_object = microtime(true) - $ts_o;

对战:

$ts_a = microtime(true);
for($i=0;$i<=1000;$i++)
{
    array();
}
$total_array = microtime(true) - $ts_a;

计算他的结果。

echo 'Object: ' . $total_object . ' / Array: ' . $total_array;

结果:对象:0.002635 /数组:0.001243

正如您所看到的,Arrays在速度方面更快,平均为46.6%。

但是当你开始添加变量时,他们会突然转身:

$ts_o = microtime(true);
for($i=0;$i<=1000;$i++)
{
    $var = new stdClass();
    $var->booleon = true;
}
$total_object = microtime(true) - $ts_o;
unset($var);

$ts_a = microtime(true);
for($i=0;$i<=1000;$i++)
{
    $var = array();
    $var['booleon'] = true;
}
$total_array = microtime(true) - $ts_a;

echo 'Object: ' . ($total_object)  . ' / Array: ' . $total_array;

新结果: 0.0037809 /数组:0.0046189

您需要进行一些测试,然后在测试结束时找到您的平均值/模式,找到真正更好的实体。

您可以使用相同原则执行memory_get_usagehttp://php.net/manual/en/function.memory-get-usage.php对内存进行测试。

答案 2 :(得分:6)

你正在做什么?这两种结构都不是更好,这就是两者都存在的原因。所以它真的取决于你的问题集“更好”。即便如此,它可能只是您喜欢的情况。许多架构和代码设计都是个人偏好和风格。

现在,一般来说,我只有一次在数组上使用无方法对象(stdclass或自定义的对象)。如果我需要经常传递那些数据并在多个地方修改它。对于一个数组,你需要通过引用传递它,这会很麻烦,并且会引入错误源...对于一个对象,它默认传递为对象引用(不是变量引用,而是指向它的指针)宾语)。因此,对于数组,您需要执行以下操作:

function doSomething($inVar, array &$inOutArray) {
    $inOutArray['bar'] = 'baz';
}

对于修改(或可能修改)数组的每个函数。

对于一个对象,你可以这样做:

function doSomething($inVar, $object) {
    $object->bar = 'baz';
}

它更短(当然,只有一个字符,但它可能是你想要修改数组的一个字符)。它不容易出错,因为如果你以后做$object = new Something(),它将不会改变原始对象(因为它不是变量引用)...

唯一的论点是它的可读性稍差,因为&明确表示您打算修改该输入变量。但是,如果您了解对象在PHP 5中是如何工作的,那么您就不应该措手不及(因此在我看来这是一个可以接受的权衡)...