Оптимизирует ли PHP аргументы функций типа массива, явно не переданного по ссылке, если они не изменены?

Будет ли механизм PHP оптимизировать второй пример, чтобы передать $arr по ссылке?

function test1(array &$arr)
{
$arr[] = 123;

echo $arr[0];
}

function test2(array $arr)
{
echo $arr[0];
}

6

Решение

PHP использует механизм под названием копирование при записи чтобы точно избежать чрезмерного копирования переменных, если это не нужно. Так что даже в вашем test2() пример $array не копируется вообще. Если бы вы изменили $array внутри функции PHP скопировал бы переменную, чтобы позволить модификацию. Подробное объяснение этого механизма можно найти в «Управление памятью» глава «PHP Internals Book». Следующая цитата из «Подсчет ссылок и копирование при записи» раздел:

Если вы немного подумаете над вышесказанным, вы придете к выводу
что PHP, должно быть, очень много копирует. Каждый раз, когда вы проходите
что-то в функцию значение должно быть скопировано. Это не может быть
особенно проблематично для целого или двойного числа, но представьте
передача массива с десятью миллионами элементов в функцию. копирование
миллионы элементов при каждом вызове будут слишком медленными.

Чтобы избежать этого, в PHP используется парадигма копирования при записи: zval может
быть общими для нескольких переменных / функций / и т. д., если только
читать и не изменять. Если один из владельцев хочет изменить его,
zval необходимо скопировать перед применением любых изменений.

Следующие две статьи обеспечивают еще большее понимание этой темы (обе написаны разработчиками ядра PHP):

Первый даже объясняет, почему использование ссылок только из соображений производительности чаще всего является плохой идеей:

Другая причина, по которой люди используют ссылку, заключается в том, что они
код быстрее. Но это неправильно. Это еще хуже: ссылки в основном
сделать код медленнее!

Да, ссылки часто делают код медленнее — Извините, мне просто нужно было
повторите это, чтобы прояснить.

А второй показывает, почему объекты не передаются по ссылке в PHP5 +.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]