5

在 PHP 文档中它说:

不要使用按引用返回来提高性能。引擎会自行自动优化。

我希望返回对数组的引用(这是我的类的属性)。PHP如何优化这一点,因为数组不是对象?

如果数组有 10 亿个条目,如果我不通过引用传递它,我不会得到两个存储在内存中的 10 亿个条目的数组吗?

4

1 回答 1

5

PHP 使用写入时复制。这意味着如果您将巨大的数组作为函数参数传递并仅从中读取(例如 foreach),您将不会写入它,因此它不需要制作副本。

$count = count($huge_array); // read the reference at the bottom
for($i = 0; $i < $count $i++) {
    $value = 2*$huge_array[$i]/15;
    if($value > 3)
        $sub_array []= $value;
}

$subarray 应该更小(它是巨大数组的子集),将只包含所需的(更改的)数据。

如果您不打算更改原始 $huge_array 的值,它将永远不会被复制,因此不会使用额外的内存。

如果您打算更改数组的原始值,则需要通过引用传递它。

如果您打算制作并返回原始数组的更改版本,那么您确实需要PHP 为您分配的额外内存。

如果您打算制作并返回原始数组的更改后的较小子集,那么您将创建一个新的空数组,您将从巨大的数组中复制一些数据并注意不要覆盖 $huge_array 中的值,因此您' 将避免从 $huge_array 写入并强调从中读取。

链接说明 PHP 已针对按值传递用例进行了优化。

仅当变量不是传递给期望值的函数的引用时,写入时复制才有效,如果是,则将其传递会触发复制。

这使得期望参数按值传递并接收引用变量的 PHP 本机函数复制引用的值。

function foo(&$data) {
    for ($i = 0; $i < strlen($data); $i++) {
        do_something($data{$i});
    }
}

$string = "... looooong string with lots of data .....";
foo(string);

在 C 中执行 strlen 将意味着遍历整个字符串以对其进行计数。在 PHP 中,字符串有一个附加的长度值。所以 strlen 返回从那里读取的值(快速)。

但是如果你给它一个引用的变量,它必须在读取它的长度之前复制它,所以它会遍历值以将它复制到它的参数列表中,读取并返回长度(然后释放新复制的字符串的内存) .

于 2012-05-26T19:08:45.107 回答