PHP: Массивы

Теория: Ссылки

Обычно функции, работающие с массивами, после обработки возвращают новый массив. Но бывает и по-другому. Как правило, в таких функциях не используется возврат. Они меняют исходный массив напрямую за счет использования ссылок. Например, к таким функциям относится сортировка:

<?php

$numbers = [3, 8, 1];

sort($numbers);
print_r($numbers);
// => Array
// => (
// =>     [0] => 1
// =>     [1] => 3
// =>     [2] => 8
// => )

Обратите внимание, что в коде выше мы не пишем $sortedNumbers = sort($numbers). Функция sort() не возвращает отсортированный новый массив. Вместо этого, она меняет массив, на который ссылается $numbers. Если изменение исходного массива прошло успешно, функция возвращает булево значение true, если неуспешно — false:

<?php

$numbers = [1, 3, 4];
$result = sort($numbers);
var_dump($result); // => bool(true)

Кроме того, такие функции не умеют работать со значениями, которые не присвоены переменным. Так происходит, потому что на них нельзя получить ссылки:

<?php

print_r(sort([1, 3, 4]));
// PHP Fatal error:  Only variables can be passed by reference

С точки зрения устройства такие функции выглядят следующим образом:

<?php

function addValueToArray(&$array, $value)
{
    $array[] = $value;
}

В сигнатуре функции перед именем переменной ставится знак &, а в теле функции происходит прямое изменение без возврата.

Как лучше проектировать функции: с передачей по ссылке или по значению? В подавляющем большинстве случаев лучше использовать второй вариант. Удобнее работать с функциями, возвращающими значения — поведение программы становится более предсказуемым, потому что нет неконтролируемых изменений данных. Первый подход лучше просто никогда не использовать.

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

Рекомендуемые программы