Передача по ссылке

Тренажер по PHP для пользователей с начальным уровнем подготовки.

Тренажер PHP

В PHP по умолчанию аргументы в функцию передаются по значению. Это означает, что внутри функции создается копия переменной, и любые изменения этой копии не затрагивают исходную переменную за пределами функции.

Однако существует и другой способ — передача по ссылке. Используя специальный символ, амперсанд, мы можем сказать функции, чтобы она работала непосредственно с исходной переменной. Любые изменения, внесенные в аргумент внутри функции, отразятся на переменной, которая была передана в нее. Это мощный инструмент, который полезен для изменения данных "на месте", например, при сортировке больших массивов или когда функция должна вернуть несколько результатов.

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

Список тем

Основы: добавление символа ссылки

id: 38989_task1

Дополните код так, чтобы функция `increment` могла изменять исходную переменную. Для этого необходимо указать, что параметр `$number` должен приниматься по ссылке.

Заполните пропуски
<?php
function increment(input1S$number) {
    $number++;
}

$counter = 5;
increment($counter);
echo $counter; // Цель: вывести 6
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Поиск ошибки: почему значение не меняется?

id: 38989_task2

В этом коде есть логическая ошибка. Функция `addSuffix` должна добавлять к строке суффикс, изменяя исходную переменную `$text`. Однако текущий вывод — "Hello", а не "Hello, World!". Найдите и исправьте строку в определении функции.

Найдите ошибку и исправьте
<?php
function addSuffix($str) {
    $str .= ', World!';
}
 
$text = 'Hello';
addSuffix($text);
echo $text;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Предсказание результата: работа с массивом

id: 38989_task3

Функция `addElement` принимает массив по ссылке и добавляет в него новый элемент. Проанализируйте код и укажите, какой будет итоговая длина массива `$items` после вызова функции.

Что должно получиться?
<?php
function addElement(array &$data, $element) {
    $data[] = $element;
}

$items = ['Apple', 'Banana'];
addElement($items, 'Cherry');

echo count($items);
?>
Сообщения
Проверить
Показать подсказку

Передача по значению vs. по ссылке

id: 38989_task4

Внимательно посмотрите на объявление функции `doNothing`. Обратите внимание, как передается ее аргумент. Что выведет этот код?

Выберите правильный вариант ответа
<?php
function doNothing($var) {
    $var = 'changed';
}

$value = 'initial';
doNothing($value);
echo $value;
?>
Сообщения
Проверить
Показать подсказку

Сопоставьте поведение функции с ее объявлением

id: 38989_task5

Сопоставьте описания поведения функции (левая колонка) с соответствующими им сигнатурами функций PHP (правая колонка).

Сопоставьте строки в правой части с соответствующими строками в левой по порядковому номеру
Изменит исходную переменную, переданную в функцию.
Не изменит исходную переменную, так как работает с ее копией.
Попытка вызова с литералом (напр., `my_func(5)`) вызовет ошибку.
function my_func($param) { ... }
function my_func(&$param) { ... }
function my_func(&$param) { ... }
Сообщения
Проверить
Показать подсказку

Сборка функции для обнуления счета

id: 38989_task6

Соберите рабочий скрипт из фрагментов кода. Цель скрипта — объявить функцию `resetScore`, которая принимает переменную по ссылке и устанавливает ее значение в 0. Затем нужно вызвать эту функцию для переменной `$score` и вывести результат.

Перетяните в правильном порядке строки из одного блока в другой
echo $score;
function resetScore(&$value) {
}
$score = 100;
resetScore($score);
$value = 0;
function resetScore($value) {
echo 0;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Модификация массива в цикле foreach

id: 38989_task8

Чтобы изменить элементы массива прямо в цикле `foreach`, необходимо получать их по ссылке. Используйте токен из банка, чтобы дополнить конструкцию `foreach` и сделать так, чтобы все числа в массиве `$salaries` были увеличены вдвое.

Нужно правильно расставить в пропуски предложенные варианты
<?php
$salaries = [1000, 1500, 2000];

foreach ($salaries as input1S$salary) {
    $salary *= 2;
}

print_r($salaries);
?>
&
$
=>
->
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Разрыв ссылки с помощью unset

id: 38989_task9

В этом коде переменная `$b` становится ссылкой на `$a`. Затем команда `unset($b)` уничтожает саму ссылку, то есть переменную `$b`. Как вы думаете, повлияет ли это на значение, которое хранится в `$a`? Введите итоговое значение `$a`.

Что должно получиться?
<?php
$a = 42;
$b = &$a;
$b = 100;

unset($b);

echo $a;
?>
Сообщения
Проверить
Показать подсказку
🚀 Визуализатор кода
0 / 0
Скорость:
Режим:
💡 Что происходит?
Загрузите пример для начала...
🤔
Проверка знаний
История шагов
Готов
НайтиКурс.Ру