В PHP по умолчанию аргументы в функцию передаются по значению. Это означает, что внутри функции создается копия переменной, и любые изменения этой копии не затрагивают исходную переменную за пределами функции.
Однако существует и другой способ — передача по ссылке. Используя специальный символ, амперсанд, мы можем сказать функции, чтобы она работала непосредственно с исходной переменной. Любые изменения, внесенные в аргумент внутри функции, отразятся на переменной, которая была передана в нее. Это мощный инструмент, который полезен для изменения данных "на месте", например, при сортировке больших массивов или когда функция должна вернуть несколько результатов.
В этом наборе заданий мы разберемся, как и когда использовать передачу по ссылке. Вы научитесь правильно объявлять такие функции, увидите разницу в результате по сравнению с передачей по значению и исправите ошибки в коде, связанные с этой механикой.
- Модуль 1: Основы синтаксиса PHP
- Модуль 2: Переменные и типы данных
- Модуль 3: Операторы
- Модуль 4: Условные конструкции
- Модуль 5: Циклы
- Модуль 6: Массивы
- Индексированные массивы.
- Ассоциативные массивы.
- Многомерные массивы.
- Добавление элементов в массив.
- Удаление элементов из массива.
- Функция count().
- Функция array_push() и array_pop().
- Функция array_shift() и array_unshift().
- Функция array_merge().
- Функция array_slice().
- Функция array_splice().
- Функция in_array().
- Функция array_search().
- Функция array_keys() и array_values().
- Функция array_unique().
- Функция array_reverse().
- Сортировка: sort(), rsort().
- Сортировка: asort(), arsort().
- Сортировка: ksort(), krsort().
- Функция array_map().
- Функция array_filter().
- Функция array_reduce().
- Функция array_walk().
- Функция array_column().
- Деструктуризация массивов.
- Модуль 7: Функции
- Объявление функций.
- Вызов функций.
- Параметры функций.
- Возврат значений return.
- Значения параметров по умолчанию.
- Передача по значению.
- Передача по ссылке.
- Переменное количество аргументов.
- Оператор распаковки ....
- Типизация параметров.
- Типизация возвращаемых значений.
- Nullable типы.
- Union типы (PHP 8).
- Именованные аргументы (PHP 8).
- Анонимные функции.
- Стрелочные функции.
- Замыкания и use.
- Рекурсивные функции.
- Глобальные переменные в функциях.
- Статические переменные в функциях.
- Модуль 8: Работа со строками
- Одинарные и двойные кавычки.
- Экранирование символов.
- Heredoc и Nowdoc синтаксис.
- Функция strlen().
- Функция substr().
- Функция str_replace().
- Функция strpos() и strrpos().
- Функция explode() и implode().
- Функция trim(), ltrim(), rtrim().
- Функция strtolower() и strtoupper().
- Функция ucfirst() и ucwords().
- Функция str_repeat().
- Модуль 9: Суперглобальные переменные
- Модуль 10: Работа с формами
- Модуль 11: Работа с файлами
- Модуль 12: Дата и время
- Модуль 13: Регулярные выражения
- Модуль 14: Сессии и Cookie
- Модуль 15: Include и Require
- Модуль 16: Объектно-ориентированное программирование
- Модуль 17: Пространства имен
- Модуль 18: Обработка ошибок и исключений
- Модуль 19: Работа с JSON и XML
- Модуль 20: Работа с базами данных MySQLi
- Модуль 21: PDO - PHP Data Objects
- Модуль 22: Composer и зависимости
- Модуль 23: cURL и HTTP запросы
- Модуль 24: REST API
- Модуль 25: Безопасность
- Модуль 26: Генераторы и итераторы
- Модуль 27: Reflection API
- Модуль 28: Работа с изображениями
- Модуль 29: Отправка email
- Модуль 30: Паттерны проектирования
- Модуль 31: Тестирование
- Модуль 32: Продвинутые возможности PHP 8+
Основы: добавление символа ссылки
Дополните код так, чтобы функция `increment` могла изменять исходную переменную. Для этого необходимо указать, что параметр `$number` должен приниматься по ссылке.
<?php
function increment(input1S$number) {
$number++;
}
$counter = 5;
increment($counter);
echo $counter; // Цель: вывести 6Поиск ошибки: почему значение не меняется?
В этом коде есть логическая ошибка. Функция `addSuffix` должна добавлять к строке суффикс, изменяя исходную переменную `$text`. Однако текущий вывод — "Hello", а не "Hello, World!". Найдите и исправьте строку в определении функции.
<?phpfunction addSuffix($str) { $str .= ', World!';} $text = 'Hello';addSuffix($text);echo $text;Предсказание результата: работа с массивом
Функция `addElement` принимает массив по ссылке и добавляет в него новый элемент. Проанализируйте код и укажите, какой будет итоговая длина массива `$items` после вызова функции.
<?php
function addElement(array &$data, $element) {
$data[] = $element;
}
$items = ['Apple', 'Banana'];
addElement($items, 'Cherry');
echo count($items);
?>Передача по значению vs. по ссылке
Внимательно посмотрите на объявление функции `doNothing`. Обратите внимание, как передается ее аргумент. Что выведет этот код?
<?php
function doNothing($var) {
$var = 'changed';
}
$value = 'initial';
doNothing($value);
echo $value;
?>Сопоставьте поведение функции с ее объявлением
Сопоставьте описания поведения функции (левая колонка) с соответствующими им сигнатурами функций PHP (правая колонка).
function my_func($param) { ... }function my_func(&$param) { ... }function my_func(&$param) { ... }Сборка функции для обнуления счета
Соберите рабочий скрипт из фрагментов кода. Цель скрипта — объявить функцию `resetScore`, которая принимает переменную по ссылке и устанавливает ее значение в 0. Затем нужно вызвать эту функцию для переменной `$score` и вывести результат.
echo $score;function resetScore(&$value) {}$score = 100;resetScore($score);$value = 0;function resetScore($value) {echo 0;Модификация массива в цикле foreach
Чтобы изменить элементы массива прямо в цикле `foreach`, необходимо получать их по ссылке. Используйте токен из банка, чтобы дополнить конструкцию `foreach` и сделать так, чтобы все числа в массиве `$salaries` были увеличены вдвое.
<?php
$salaries = [1000, 1500, 2000];
foreach ($salaries as input1S$salary) {
$salary *= 2;
}
print_r($salaries);
?>Разрыв ссылки с помощью unset
В этом коде переменная `$b` становится ссылкой на `$a`. Затем команда `unset($b)` уничтожает саму ссылку, то есть переменную `$b`. Как вы думаете, повлияет ли это на значение, которое хранится в `$a`? Введите итоговое значение `$a`.
<?php
$a = 42;
$b = &$a;
$b = 100;
unset($b);
echo $a;
?>