使用数组VS对象存储数据

Ema*_*sev 17 php

可能重复:
我应该何时使用stdClass,何时应该在php5中使用数组oo代码?

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

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

// object
$user->name = 'Emanuil';
Run Code Online (Sandbox Code Playgroud)

Ken*_*ins 33

数组

  • array_*,可以在阵列中,其中大部分是非常快的工作职能.
  • 默认情况下,它们按值传递(复制)
  • 轻量级/简单(仅更改效果局部变量,更少考虑)
  • 通常用于构建一次数据(不会更改的数据)
  • 所有数据都是公开的
  • 少资源密集型

对象

  • 可以使用方法来保持数据更严格.(IE.检查字段是否适合格式)
  • 子类化(减少代码重复)
  • 默认情况下,它们通过引用传递
  • 数据的变化可以有连锁效应(__get,__set,等)
  • 通常用于更可变的数据
  • 可以通过函数和受保护/私有变量保护外部数据
  • 对象的函数类型提示更灵活(不同类的不同typehint)


Rob*_*itt 8

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

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

与:

$ts_a = microtime(true);
for($i=0;$i<=1000;$i++)
{
    array();
}
$total_array = microtime(true) - $ts_a;
Run Code Online (Sandbox Code Playgroud)

并计算他的结果.

echo 'Object: ' . $total_object . ' / Array: ' . $total_array;
Run Code Online (Sandbox Code Playgroud)

结果:对象: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;
Run Code Online (Sandbox Code Playgroud)

新结果:0.0037809 /数组:0.0046189

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

你可以通过以下方式对内存进行测试memory_get_usage:http://php.net/manual/en/function.memory-get-usage.php,原理相同.

  • IMO性能考虑因素决定是否使用其中一个. (11认同)
  • 好吧,让我们重新说一下"在决定使用哪个时,性能考虑不应该是你的主要关注点".如果它们是一个问题,那么我们不要忘记[新的Spl数据结构及其执行方式](http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/ ). (2认同)

irc*_*ell 6

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

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

function doSomething($inVar, array &$inOutArray) {
    $inOutArray['bar'] = 'baz';
}
Run Code Online (Sandbox Code Playgroud)

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

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

function doSomething($inVar, $object) {
    $object->bar = 'baz';
}
Run Code Online (Sandbox Code Playgroud)

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

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