0 знаков
15. Пользовательские функции в PHP
КраткоОсновы функций в PHP
- Функции объявляются и вызываются с использованием синтаксиса, описанного в предыдущем уроке.
- Параметры и аргументы являются ключевыми элементами функций.
Использование ключевого слова return
- Ключевое слово
return
позволяет возвращать значения из функций.- Возвращаемые значения могут быть использованы для вывода или передачи в другие функции.
- Подсказки о типе (type hinting) помогают предотвратить ошибки при передаче аргументов неправильного типа.
Необязательные параметры и именованные аргументы
- Необязательные параметры могут быть добавлены для гибкости функций.
- Именованные аргументы позволяют изменять значения параметров без необходимости перечисления всех аргументов.
Строгая проверка типов
- Строгая проверка типов предотвращает автоматическое преобразование данных и вызывает ошибку при передаче неверных данных.
- Строгая проверка типов может быть включена с помощью специальной команды.
Примеры функций
- В статье приведены примеры функций, которые сортируют строки по длине, проверяют палиндромы, проверяют уникальность массивов, фильтруют массивы по типу и генерируют случайные числа.
Заключительные замечания
- Автор подчеркивает важность саморазвития в изучении PHP и предлагает продолжить изучение дополнительных материалов.
- Задания для самостоятельной работы включают написание функций для сортировки, проверки палиндромов и других задач.
В предыдущем уроке мы с вами начали обсуждать тему функций. Я показал синтаксис, как они объявляются и вызываются, рассказал, что такое параметр и аргумент. В этом уроке мы углубим знания по их созданию и использованию.
Впервые глядя на PHP-код, можно подумать, что операторы должны выполняться так, как они записаны, один за другим. Однако на практике интерпретатор PHP может выполнять операторы в совершенно другом порядке.
Как правило, вы будете видеть функции, объявленные в верхней части страницы. Если в верхней части страницы также объявляются переменные, то эти переменные обычно объявляются перед определениями функций.
Позже функции вызываются в коде, в котором необходимо выполнить задачу.
Даже если функции написаны в верхней части страницы, определение функции только сохраняет код, выполняющий задачу. Интерпретатор PHP не выполняет этот код до тех пор, пока функция не будет вызвана. Это означает, что инструкции могут выполняться в совершенно ином порядке, чем они написаны в коде.
<?php
function getNumber()
{
echo 10;
}
function getString()
{
echo 'Codebra';
}
?>
Если мы оставим код в таком виде, ничего не произойдет. Интерпретатор PHP дойдёт до этого места с объявлением функции, отложит её в памяти и будет искать место вызова. По окончании работы программы он всё удалит из памяти.
ВажноВ этом курсе мы не будем писать о том, как работает очистка памяти в PHP. Вместо этого я предлагаю вам самим прочитать вот эту [ссылка доступна авторизованным пользователям].
Сделаем вызов функций:
<?php
function getNumber()
{
echo 10;
}
function getString()
{
echo 'Codebra';
}
getNumber();
getString();
?>
В этом коде мы вызвали две функции. После чего произойдёт автоматическая очистка памяти.
Ключевое слово return
До этого мы создавали функции, которые после вызова сами выводили нужные нам значения на экран. Так можно делать, но это примитивное применение. Не стоит так делать (хотя есть, конечно же, исключения в правилах, но в целом нужно использовать ключевое слово return
).
Так что же такое return
? Переведём на русский язык это - возвратить. То есть мы возвращаем нужное нам значение из функции, после его уже можем распечатывать.
<?php
function getString(string $str): string // Возвращаем тип данных строку
{
return "Я люблю {$str}"; // Возвратит нам строку
}
echo getSting('PHP'); // Распечатает нам строку 'Я люблю PHP'
?>
Как видите, мы немного усложнили код, но и распределили обязанности: функция возвращает нам всего одну строку, нужную нам. Затем мы выводим эту строку на экран, без чего мы не сможем увидеть результат. Мы даже можем передать эту функцию в другую функцию. Также можем сохранить возвращаемое значение функции в переменной и использовать его дальше в программе.
Вы могли заметить, что я рядом с функцией указал : string
— это не что иное, как type hinting
(подсказка о типе). Если мы передадим числовое значение в качестве аргумента, интерпретатор выдаст нам ошибку. Если же функция вернёт не строку, а число, это также приведет к ошибке. Таким образом, мы защищаемся от неожиданных данных. Мы ожидаем строку в параметре, и, следовательно, если там будет не тип string
, мы получим ошибку.
ЗапомнитеПосле срабатывания
return
, дальнейшее выполнение функции прекращается.
Необязательные параметры
Не всегда функции нужны все параметры, некоторые из них мы можем сделать необязательными.
В следующем примере сделаем чтобы все параметры были обязательными:
<?php
function getNumber(int $num1, int $num2)
{
return $num1 * $num2;
}
echo getNumber(2, 2); // Распечатает 4
?>
Хорошо, предположим, что передаваемое число всегда увеличивается в два раза по умолчанию. Это приведет к ошибке:
<?php
function getNumber(int $num1, int $num2)
{
return $num1 * 2;
}
echo getNumber(2); // Будет ошибка
?>
Будет следующая ошибка: Fatal error: Uncaught ArgumentCountError: Too few arguments to function getNumber()
.
Исправим это, добавив значение по умолчанию:
<?php
function getNumber(int $num1, int $num2 = 2) // Изначально укажем нужное значение
{
return $num1 * $num2;
}
echo getNumber(2); // Распечатает 4
?>
Тогда код будет отрабатывать нормально. В таком случае, обязательные параметры лучше расположить перед необязательными.
Именованные аргументы
Но если мы захотим изменить второй необязательный параметр, не трогая все остальные, у нас будет два варианта: первый — перечислить заново все аргументы, а второй — использовать именованные аргументы.
Изменим второй необязательный параметр:
<?php
function getString(int $num, string $site = 'Codebra', $prog = 'PHP')
{
return "Сайту {$site} исполнилось {$num}. Я изучаю язык программирования {$prog} ";
}
echo getString(num: 10, prog: 'HTML'); // Распечатает => Сайту Codebra исполнилось 10. Я изучаю язык программирования HTML
?>
Если уберете именованный аргумент prog
, то увидите, что первый параметр изменится. В обязательных параметрах можно опускать имена, однако я не рекомендую так делать — лучше указывать их для улучшения читаемости.
Строгая проверка типов
Если в функции явно указаны типы аргументов и возвращаемых значений, то в случае совсем неверных данных будет ошибка. Например, если будет передана строка абв
вместо числа. Однако интерпретатор может «смотреть сквозь пальцы», если передаются правильные данные, но неправильного типа, например строка '1' там, где ожидается число. Вы можете указать интерпретатору генерировать ошибку и в таких случаях.
Дело в том, что для некоторых скалярных типов интерпретатор PHP может попытаться преобразовать значение автоматически. Например, при передаче аргумента в функцию или возврате значения из нее, в следующих случаях интерпретатор PHP будет преобразовывать:
- строку
'1'
в целое число1
; - логическое значение
true
— в целое число1
; - логическое значение
false
— в целое число0
; - целое число
1
— в логическое значениеtrue
; - целое число
0
— в логическое значение false.
Вы можете указать интерпретатору PHP включить строгую проверку типов, чтобы он не пытался их преобразовывать, а сразу вызывал ошибку в случаях, если функция:
- вызывается с аргументом неверного типа (если он был указан);
- возвращает значение неверного типа данных (если был указан тип возвращаемого значения).
Возникающие при этом ошибки могут помочь отследить источник проблем в PHP коде. Такое поведение необходимо включать специально, с помощью команды, приведенной ниже. Причем делать это надо на той странице, где функция вызывается. И это обязательно должен быть первый оператор на странице.
<?php
declare(strict_types = 1); // Вклюачаем строгую проверку
?>
Запустите этот пример у себя со строгой проверкой и без:
<?php
declare(strict_types = 1);
function getString(int $number) {
if ($number) {
return '+++';
}
}
echo getString('1');
?>
Я думаю, вы наглядно поняли, что интерпретатор не будет автоматически переводить строку в число, а число — в булево значение, а сразу покажет вам ошибку. Строгая проверка позволяет нам допускать меньше ошибок в коде.
ВажноНе будьте ленивыми, прочитайте эту [ссылка доступна авторизованным пользователям], где подробно говорится об типизации. Повторюсь, я не буду рассказывать всё досконально, а буду давать ссылки, чтобы вы могли прочитать материал самостоятельно. В любом случае, когда вы закончите курс, вам нужно будет продолжать изучать экосистему PHP. Саморазвитие никто не отменял :)
Несколько инструкций return в одной функции
Чтобы определить, какое значение должно быть возвращено, функция может использовать условные конструкции. В примере ниже функция возвращает разные сообщения в зависимости от значения, переданного в качестве аргумента.
<?php
function getStockMessage(int $stock): string
{
if ($stock => 10) {
return 'Хорошая доступность';
} elseif ($stock > 0 && $stock < 10) {
return 'Слабая доступность'
}
return 'Ошибка!!!'; // Срабавает только тогда, когда не одно из условия не подошло
}
?>
Как только в коде функции выполняется конструкция return
, интерпретатор PHP возвращается к строке кода, вызвавшей функцию. Ни один из последующих операторов в этой функции выполняться не будет.
В приведенной выше функции конструкция return
вызывается три раза.
- В условии проверяется, равно ли или больше 10 значение параметра
$stock
. Если условие выполняется, то обрабатывается первая конструкцияreturn
, а последующие инструкции в функции выполняться не будут. - Если значение параметра
$stock
больше0
и меньше10
, срабатывает вторая конструкцияreturn
, и последующий код функции выполняться не будет. - Если функция все еще выполняется, это значит, что параметр
$stock
меньше либо равен нулю. В этом случае будет выполнена последняя конструкцияreturn
.
Заключение
Ох... Много информации я вам дал? Я посчитал нужным сразу рассказать вам о работе с пользовательскими функциями. Не волнуйтесь, если что-то забудете — это нормально. Вы всегда сможете вернуться к этому уроку или написать мне, и я помогу вам разобраться и понять.
Далее мы с вами изучим встроенные функции в язык PHP. Поверьте, их очень много, но мы рассмотрим только самые важные.
Задания
1. Напишите функцию sortByLength(array $strings): array
, которая принимает массив строк и возвращает массив, отсортированный по длине строк (от короткой к длинной).
2. Напишите функцию isPalindrome(string $word): bool
, которая проверяет, является ли заданное слово палиндромом (читается одинаково слева направо и справа налево).
3. Напишите функцию isArrayUnique(array $arr): bool
, которая проверяет, содержит ли массив только уникальные значения.
4. Реализуйте функцию filterByType(array $arr, string $type): array
, которая фильтрует массив, оставляя только элементы указанного типа (bool
, int
).
5. Создайте функцию guessNumber(int $number): string
, которая генерирует случайное число от 1 до 100 и сравнивает его с введенным пользователем числом, возвращая подсказку ("больше", "меньше" или "угадал") - используйте функцию [ссылка доступна авторизованным пользователям].
6. Напишите функцию findAnagrams(string $word, array $wordList): array
, которая принимает слово и массив слов, возвращая только те слова, которые являются анаграммами исходного.
Похожие уроки Codebra
Подписывайся на наш Telegram-канал!
Новости, полезный материал,
программирование и ИБ
Подписывайся на наш Telegram-канал!
Новости, полезный материал,
программирование и ИБ