0

我阅读了这个问题的答案,但它引发了更多问题: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 使用带有引用的写时复制 - 如果引用只是被读取而不是被写入,这是否是一种能够访问对象的有效方法?我也在想也许我可以将数组键名存储在$this->types->$type数组中。

4

2 回答 2

2

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

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

只要您只是从 读取$this->types->$type,它将指向与$this->content['alias1'].

于 2013-07-18T15:20:13.387 回答
1

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

但是有一种方法可以检查。使用以下 2 个函数:

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

于 2013-07-18T15:22:00.697 回答