Обычно функции, работающие с массивами, после обработки возвращают новый массив. Но бывает и по-другому. Как правило, в таких функциях не используется возврат. Они меняют исходный массив напрямую за счет использования ссылок. Например, к таким функциям относится сортировка:
<?php
$numbers = [3, 8, 1];
sort($numbers);
print_r($numbers);
// => Array
// => (
// => [0] => 1
// => [1] => 3
// => [2] => 8
// => )
https://repl.it/@hexlet/php-arrays-references-sort
Обратите внимание, что в коде выше мы не пишем $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;
}
В сигнатуре функции перед именем переменной ставится знак &
, а в теле функции происходит прямое изменение без возврата.
Как лучше проектировать функции: с передачей по ссылке или по значению? В подавляющем большинстве случаев лучше использовать второй вариант. Удобнее работать с функциями, возвращающими значения — поведение программы становится более предсказуемым, потому что нет неконтролируемых изменений данных. Первый подход лучше просто никогда не использовать.
Изменение массивов напрямую сложнее в отладке, но в некоторых языках повышает эффективность работы. Если массив достаточно большой, то полное копирование окажется дорогой операцией. В реальной жизни веб-разработчика это почти никогда не считается проблемой, но знать об этом полезно.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.