Большинство функций, работающих с массивами, после обработки возвращают новый массив. Но некоторые работают по-другому. В этих функциях, как правило, не используется возврат. Они меняют исходный массив напрямую за счёт использования ссылок. К таким функциям, например, относится функция сортировки:
<?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;
}
В сигнатуре функции, перед именем переменной, ставится знак &
, а в теле функции происходит прямое изменение без возврата.
Возникает вопрос, как лучше проектировать функции: с передачей по ссылке или по значению? В подавляющем большинстве случаев предпочтителен второй вариант. Функции, возвращающие значения, удобнее в работе, а поведение программы становится в целом более предсказуемым, так как отсутствуют неконтролируемые изменения данных. Первый подход лучше просто никогда не использовать.
Несмотря на то, что подход, меняющий массивы напрямую, сложнее в отладке, его используют в некоторых языках для увеличения эффективности работы. Если массив достаточно большой, то полное копирование окажется дорогой операцией. В реальной жизни (веб-разработчика) это почти никогда не является проблемой, но знать об этом полезно.
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
Зарегистрируйтесь или войдите в свой аккаунт