Зарегистрируйтесь, чтобы продолжить обучение

Ссылки PHP: Массивы

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

<?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;
}

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

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

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


Дополнительные материалы

  1. Продуманная оптимизация
  2. Передача по ссылке
  3. Возврат по ссылке
  4. Функция sort

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Программирование на PHP, Разработка веб-приложений и сервисов используя Laravel, проектирование и реализация REST API
10 месяцев
с нуля
Старт 2 января

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»