在 PHP 文档中它说:
不要使用按引用返回来提高性能。引擎会自行自动优化。
我希望返回对数组的引用(这是我的类的属性)。PHP如何优化这一点,因为数组不是对象?
如果数组有 10 亿个条目,如果我不通过引用传递它,我不会得到两个存储在内存中的 10 亿个条目的数组吗?
在 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 返回从那里读取的值(快速)。
但是如果你给它一个引用的变量,它必须在读取它的长度之前复制它,所以它会遍历值以将它复制到它的参数列表中,读取并返回长度(然后释放新复制的字符串的内存) .