PHP变量别名(引用?) - 试图减少内存使用量

时间:2013-07-18 15:15:11

标签: php memory memory-management reference

我阅读了这个问题的答案,但它引出了更多问题:PHP variables reference and memory usage

简而言之,我有一个项目,我正在尝试循环遍历多维数组以获取一个值,然后继续进程或循环。在代码中解释会更容易:

// Demo variables
$this->content['alias1'] = ('object' => new someObject; 'info' => array('type' => 'abc'));
$this->content['alias2'] = ('object' => new someObject; 'info' => array('type' => 'def'));
$this->content['alias3'] = ('object' => new someObject; 'info' => array('type' => 'abc'));

......这非常简单,但它得到了重点。 我想循环遍历并查找所有'abc'的'类型' - 最简单的方法是什么?我有类似的东西

foreach($this->content as $alias => $data) {
    if ($data['info'] != 'abc') {
       break;
    }

    // Do actual "abc" things
}

但是我正在尝试将所有这些代码编写为内存尽职尽责。我觉得这可能是一种更有效的方法。

我在想,当加载对象时(这实际上是一个配置文件),它会为另一个变量分配一个引用,比如

$this->types->$type =& $this->content['alias1'];

每个。在上面引用的问题中,它说PHP使用带引用的copy-on-write - 如果引用只是读取,从不写入,这是否是一种能够访问对象的有效方法?我也在想,也许我可以将数组键名存储在$this->types->$type数组中。

2 个答案:

答案 0 :(得分:2)

写入时复制意味着如果您不写入目标变量,PHP将自动为您创建引用。如果您编写,它将复制原始值,并改为修改副本。底线是:在这种情况下,您不需要通过引用手动分配,您只需使用常规分配:

$this->types->$type = $this->content['alias1'];

只要你只是从$this->types->$type阅读,它就会指向内存中与$this->content['alias1']相同的值。

答案 1 :(得分:1)

PHP会在写入时复制你传递的大多数变量作为参数。无论如何,这就是我的实验让我相信(即使你可以在特殊情况下解决这个问题)< / em>的。所以,如果你只需要循环而不使用引用等等......你就会安全。

但是有办法检查。使用以下2个功能:

在代码中使用这两个函数,并检查代码执行进展时内存消耗的变化情况。 这样,无论您使用PHP做什么时髦的事情,您都可以轻松判断PHP是否仍在进行写时复制或为您完成复制。