Урок 11. Пользовательские функции в PHP
Теория
Зачем нужны пользовательские функции?
Возникает такая ситуация, когда некоторые участки кода повторяются несколько раз в разных местах. Пользовательские Функции нужны для того, чтобы убрать дублирование кода.
Дублирование плохо тем, что если потребуется что-то поменять в коде, это придется сделать во многих местах.
Кроме того, функции скрывают внутри себя какой-то код, о котором нам не приходится задумываться. Например, у нас есть функция s(), которая сохраняет пользователя в базу данных. Мы можем просто вызывать ее, не задумываясь о том, какой код выполняется внутри функции. Это очень удобно. В программировании это называется инкапсуляцией.
Синтаксис функций пользователя
Функция создается с помощью команды function. Далее через пробел следует имя функции и круглые скобки. Круглые скобки могут быть пустыми, либо в них могут быть указаны параметры, которые принимает функция.Параметры - это обычные переменные PHP. Сколько может быть параметров: 1, несколько (в этом случае они указываются через запятую), ни 1 (в этом случае круглые скобки все равно нужны, хоть они и будут пустыми).
<?//'f' - это имя функции, ей передается 1 параметр $p:
function f($p){}
//Передаем функции 2 параметра - $a и $b:
function f($a,$b){}
//Вообще не передаем никаких параметров:
function f(){}?>
Обратите внимание на фигурные скобки в примерах: в них пишется код, который выполняет функция. Общий синтаксис функции выглядит так:
<?function имя_функции(здесь перечисляются параметры через запятую){Здесь написаны команды, которые выполняет функция}?>
Внимание! На 1 странице не должно быть повторяющихся имен функций.
Как вызвать функцию в коде?
Саму функцию можно вызвать в любом месте страницы (даже до ее определения). Функция вызывается по ее имени. При этом круглые скобки после ее имени обязательны, даже если они пустые. Пример:
Пишем функцию h, которая выводит на экран 'Привет, мир! ':
<?function h(){/*Тут пишем, что должна делать функция h*/echo'Привет, мир! ';}/*Тут вызывается функция h*/h();/*Функция печатает 'Привет, мир! '*/?>
Привет, мир!
Можно вывести фразу несколько раз, для этого достаточно написать функцию не 1 раз, а несколько:
<?h();h();h()?>
Привет, мир! Привет, мир! Привет, мир!
Подробнее о параметрах
В наших примерах мы вызывали функцию h() без параметров. Т.к. имя функции не должно повторяться на странице, делаем функцию d().
Теперь попробуем ввести параметр, который будет задавать текст, выводимый функцией d:
<?function d($q){/*Тут укажем параметр $q. Выведем на экран значение переменной $q:*/echo$q;}/*Теперь вызовем нашу функцию:*/d('Привет, Земляне')/*она выведет именно ту фразу, которую ей передали*/?>
<?function d($q){echo$q;}d('Привет, Земляне')?>
Привет, Земляне
Обратите внимание на переменную $q в нашей функции: в ней появляется то, что мы передали в круглых скобках при вызове функции.
Как PHP знает, что текст 'Привет, Земляне' нужно положить в переменную $q? Мы сказали ему об этом, когда создавали нашу функцию, вот тут: 'function d($q)'.
Если задается несколько параметров, то каждый из них будет лежать в своей переменной внутри функции.
Инструкция return
Чаще всего функция должна не выводить что-то через echo на экран, а возвращать.
Сделаем теперь так, чтобы функция не выводила что-то на экран, а возвращала текст скрипту, чтобы он смог записать этот текст в переменную и как-то обработать его дальше:
<?/*Зададим функцию:*/function e($q){/*Укажем функции с помощью инструкции 'return', что мы хотим, чтобы она вернула текст, а не вывела на экран:*/return$q;}/*Теперь вызовем нашу функцию и запишем значение в переменную message:*/$m=e('Привет, Земляне');/*Пока вывода на экран нет. И теперь в переменной $m лежит 'Привет, Земляне':*/echo$m;/*Убедимся в этом. Можно не вводить промежуточную переменную $m, а сделать так:*/echo'<p>'.e('Привет, Земляне')?>
<?function e($q){return$q;}$m=e('Привет, Земляне');echo$m;echo'<p>'.e('Привет, Земляне')?>
Привет, Земляне
Привет, Земляне
В принципе, практической пользы от того, что мы сделали - никакой, т.к. функция вернула нам то, что мы ей передали. Модернизируем пример так, чтобы функция принимала имя человека, а выводила строку 'Привет, %имя_человека_переданное_функции%!':
<?/*Зададим функцию:*/function g($n){/*Укажем здесь параметр $n, в котором будет лежать имя человека. Введем переменную $q, в которую запишем всю фразу:*/$q='Привет, '.$n.'! ';/*Укажем функции с помощью инструкции 'return', что мы хотим, чтобы она вернула содержимое переменной $q:*/return$q;}/*Теперь вызовем нашу функцию и запишем значение в переменную $message:*/$m=g('Иван');/*И теперь в переменной $q лежит 'Привет, Иван! ':*/echo$m./*убедимся в этом. Поздороваемся сразу с группой людей из 3 человек:*/'<p>'.g('Вася').g('Петя')..g('Коля')?>
<?function g($n){$q='Привет, '.$n.'! ';return$q;}$m=g('Иван');echo$m.'<p>'.g('Вася').g('Петя').g('Коля')?>
Привет, Иван!
Привет, Вася! Привет, Петя! Привет, Коля!
Частая ошибка с return
После того, как выполнится инструкция return, функция закончит свою работу. Т.е. после выполнения return больше никакой код не выполнится.
Это не значит, что в функции должен быть 1 return. Но выполнится только 1 из них. Такое поведение функций является причиной многочисленных трудноуловимых ошибок.
Пример:
<?function u($p){/*Если переменная $p имеет значение true, то вернем 'Верно'. Напоминаю о том, что конструкция if($p) эквивалентна if($p===true)*/if($p)return'Верно';/*Далее в PHP хотим проделать еще какие-то операции, но если переменная $p имеет значение true, сработает инструкция return, и код ниже работать не будет! Напротив, если $p===false, инструкция return не выполнится и код дальше будет работать*/echo'Привет, мир!';}/*Осознайте это и не совершайте ошибок*/?>
<?function u($p){if($p)return'Верно';echo'Привет, мир!';}?>
ПРОВЕРЬ!!!
Приемы работы с return
Существуют некоторые приемы работы с return, упрощающие код. Как сделать проще всего:
<?function j($p){/*Что делает код: если $p имеет значение true, то в переменную $r запишем 'Верно', иначе 'Неверно':*/if($p){$r='Верно';}else{$r='Неверно';}/*Вернем содержимое переменной result:*/return$r;}?>
<?function j($p){if($p){$r='Верно';}else{$r='Неверно';}return$r;}?>
Теперь упростим нашу функцию, используя прием работы с return:
<?function k($p){/*Что делает код: если $p имеет значение true, вернет 'Верно', иначе вернет 'Неверно'*/if($p){return'Верно';}else{return'Неверно';}}?>
<?function k($p){if($p){return'Верно';}else{return'Неверно';}}?>
Обратите внимание, насколько упростился код. Плюсом также является то, что мы убрали лишнюю переменную $r.
ПРОВЕРЬ!!!
Практика
Примеры решения задач
Задача
Сделать функцию, которая возвращает куб числа. Число передается параметром.
Решение:
<?function a($n){return$n*$n;};echo a(2)?>
4.
Внимание! На 1 странице не должно быть повторяющихся имен функций.
<?function b($n){return$n*$n/9;};echo b(3)?>.
1.
Задачи для решения
Простые функции
Сделать функцию, которая возвращает квадрат числа. Число передается параметром.
Сделать функцию, которая возвращает сумму 2 чисел. Числа передаются параметрами функции.
Сделать функцию, которая отнимает от 1-го числа 2-е и делит на 3-е.
Сделать функцию, которая принимает параметром число от 1 до 7, а возвращает день недели на русском языке.