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


PHP Variable aliases (References?) - trying to reduce memory usage

我读了这个问题的答案,但它引出了更多的问题:PHP变量引用和内存使用

简而言之,我有一个项目,在继续处理过程或循环之前,我试图循环通过一个多维数组来获取一个值。用代码解释会更容易:

// 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使用带引用的写时复制-如果引用只读,从不写,这是访问对象的有效方法吗?我还想,也许我可以将数组密钥名称存储在$this->types->$type数组中。

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

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

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

PHP对作为参数传递的大多数变量进行写时复制无论如何,这就是我的实验让我相信的(即使你可以在特殊情况下打破这一点)。所以,如果你只需要循环,而不玩引用之类的。。。你会很安全的。

但有一种方法可以检查使用以下2个功能:

  • memory_get_usage()^
  • memory_get_peak_usage()^

在代码中使用这两个函数,并检查随着代码执行的进展,内存消耗是如何变化的这样,无论你用PHP做什么时髦的事情,你都可以很容易地判断出PHP是否仍在进行写时复制或已经为你完成了复制