可能重复:
When should I use stdClass and when should I use an array in php5 oo code ??
使用两种结构中的一种比另一种结构有什么好处?
// array
$user['name'] = 'Emanuil';
// object
$user->name = 'Emanuil';
答案 0 :(得分:32)
<强>阵列强>
array_*
函数可以在数组上运行,其中大多数都非常快。<强>物件强>
__get
,__set
等)答案 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_usage
:http://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中是如何工作的,那么您就不应该措手不及(因此在我看来这是一个可以接受的权衡)...