通过引用返回


Returning by reference

在PHP文档中它说:

不要使用按引用返回来提高性能。发动机 将自动自行优化。

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

如果数组有 10 亿个条目,

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

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 返回从那里读取的值(快速)。

但是如果你给它一个引用的变量,它必须在读取它的长度之前复制它,

这样它就会迭代这个值以将其复制到它的参数列表中,读取并返回长度(随后释放新复制的字符串的内存)。