Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос нашим менторам. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Ссылки

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

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

<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

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

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

Для полного доступа к курсу нужна профессиональная подписка

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

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов

Зарегистрироваться

или войти в аккаунт

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

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Отправляя форму, вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг». Защита от спама reCAPTCHA «Конфиденциальность» и «Условия использования».

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

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

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

Отправляя форму, вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг». Защита от спама reCAPTCHA «Конфиденциальность» и «Условия использования».