Будет ли механизм PHP оптимизировать второй пример, чтобы передать $arr
по ссылке?
function test1(array &$arr)
{
$arr[] = 123;
echo $arr[0];
}
function test2(array $arr)
{
echo $arr[0];
}
PHP использует механизм под названием копирование при записи чтобы точно избежать чрезмерного копирования переменных, если это не нужно. Так что даже в вашем test2()
пример $array
не копируется вообще. Если бы вы изменили $array
внутри функции PHP скопировал бы переменную, чтобы позволить модификацию. Подробное объяснение этого механизма можно найти в «Управление памятью» глава «PHP Internals Book». Следующая цитата из «Подсчет ссылок и копирование при записи» раздел:
Если вы немного подумаете над вышесказанным, вы придете к выводу
что PHP, должно быть, очень много копирует. Каждый раз, когда вы проходите
что-то в функцию значение должно быть скопировано. Это не может быть
особенно проблематично для целого или двойного числа, но представьте
передача массива с десятью миллионами элементов в функцию. копирование
миллионы элементов при каждом вызове будут слишком медленными.Чтобы избежать этого, в PHP используется парадигма копирования при записи: zval может
быть общими для нескольких переменных / функций / и т. д., если только
читать и не изменять. Если один из владельцев хочет изменить его,
zval необходимо скопировать перед применением любых изменений.
Следующие две статьи обеспечивают еще большее понимание этой темы (обе написаны разработчиками ядра PHP):
Первый даже объясняет, почему использование ссылок только из соображений производительности чаще всего является плохой идеей:
Другая причина, по которой люди используют ссылку, заключается в том, что они
код быстрее. Но это неправильно. Это еще хуже: ссылки в основном
сделать код медленнее!Да, ссылки часто делают код медленнее — Извините, мне просто нужно было
повторите это, чтобы прояснить.
А второй показывает, почему объекты не передаются по ссылке в PHP5 +.
Других решений пока нет …