С уровня абстракции языка так оно и есть, но в памяти интерпретатора оба массива будут храниться как один. Но как только ты в один из массивов добавишь новый элемент, интерпретатор сразу создаст копию массива для второй переменной и только тогда добавит туда новый элемент.
Например, нужно написать функцию, которая будет получать массив чисел и возвращать сумму всех этих чисел. Причём мы планируем использовать функцию для очень больших массивов, занимающих много оперативной памяти.
Сначала программист напишет так:
function ololoSum($array){
$sum=0;
$length=count($array);
for($i=0;$i<$length;$i++){
$sum+=$array[$i];
}
return $sum;
}
Потом прочитает в мануале:
Обратите внимание, что при присваивании массива всегда происходит копирование значения. Чтобы скопировать массив по ссылке, вам нужно использовать оператор ссылки.
|
И перепишет так (чтобы массив в функцию передавался по ссылке):
function ololoSum(&$array){
$sum=0;
$length=count($array);
for($i=0;$i<$length;$i++){
$sum+=$array[$i];
}
return $sum;
}
Программист будет думать, что при передаче массива в первый вариант функции будет создана копия массива (мы же не по ссылке передаём и имеем дело с локальной копией массива) и на момент вызова функции вместо 100500 килобайт занятой оперативы у нас получится 100500*2. Нихера не так. Под локальную копию массива не будет выделена новая память на содержимое массива. Вместо этого интерпретатор внутри себя будет ссылаться на ту же самую память глобально созданного массива. То есть на деле оба варианта функции будут работать примерно одинаково и не приведут к излишнему расходу памяти. Но если внутри первой функции мы напишем в каком-то месте, например, $array[0]=0; , то в этом месте интерпретатор создаст полную копию массива и только тогда изменит в нём нулевую ячейку. Вот тогда выделение памяти будет 100500*2.