PHP копирует при записи, поэтому, если данные не изменяются в функции, использование ссылки только замедляет работу.
В вашем случае вы меняете данные, поэтому происходит копирование,Проверьте следующее:
<?php
define('N', 100000);
$data = range(1, N);
srand(1);
function ref(&$data)
{
$data[rand(1, N)] = 1;
}
function ret($data)
{
$data[rand(1, N)] = 1;
return $data;
}
echo memory_get_usage()."\n";
echo memory_get_peak_usage()."\n";
ref($data);
// $data = ret($data);
echo memory_get_usage()."\n";
echo memory_get_peak_usage()."\n";
?>
Запустите его один раз с ref()
и один раз с ret()
.Мои результаты:
ref ()
- 8043280 (до / текущее)
- 8044188 (до / максимальное)
- 8043300 (после / текущее))
- 8044216 (после / пик)
ret ()
- 8043352 (до / текущий)
- 8044260 (до /пик)
- 8043328 (после / текущий)
- 12968632 (после / пик)
Итак, как вы можете видеть, PHP использует больше памяти при изменении данныхв функции и возвращая ее.Поэтому оптимальным вариантом является передача по ссылке.
Однако передача по ссылке может быть опасной, если не очевидно, что это происходит.Часто вы можете полностью избежать этого вопроса, заключив ваши данные в классы, которые изменяют свои собственные данные.
Обратите внимание, что если вы используете объекты, PHP5 всегда передает их по ссылке.