Давайте разбираться что же такое функции. В общем смысле функция это поименованный блок кода выполняющий определённую задачу. Функция может принимать набор входных параметров, а так же возвращать некоторое значение вызвавшему её коду. Функции нужны в первую очередь для того, чтобы облегчить программисту жизнь и сократить объём кода программы, т.к. они позволяют выделять в отдельные блоки набор операций с целью их повторного использования в коде программы.
Функции в php
Функции в языке программирования PHP могут быть встроенными (стандартная библиотека функций SPL поставляемая вместе языком) или определены пользователем (разработчиком программы). Вне зависимости от происхождения функции, все они имеют схожий синтаксис:
1 |
$некотораяПеременная = имя_функции(набор_параметров); |
Функция может возвращать результат (например корень из целого числа), чтобы работать дальше с этим результатом нам нужна $некотораяПеременная куда и будет сохранён результат работы функции. Есть некоторые функции которые не возвращают результат, а изменяют переменную из глобальной области видимости, связываясь с ней по ссылке.
Набор параметров которые передаются в функцию отличается для каждой функции. Параметры могут быть обязательными (если их не передать php выдаст ошибку), а могут иметь предустановленное значение определённое вместе с самой функцией. В таком случае возможен вызов функции без параметров.
Давайте рассмотрим несколько простых встроенных функций:
1 2 |
$str = 'Иван Иванов'; $nameLen = strlen($str); // функция вернёт целое число 11 |
Функция strlen($str) возвращает длину строки $str переданной в функцию в качестве аргумента.
1 2 3 |
$password = '123456'; //Зашифруем пароль $hashPassword = md5($password); // Вернёт строку e10adc3949ba59abbe56e057f20f883e |
А здесь мы применили функцию md5() которая возвращает хеш в виде 32-символьного шестнадцатеричного числа. Эту функцию часто применяют для шифрования некоторых данных таких как пароли пользователей, чтобы не хранить их в базе данных в открытом виде.
Определение функции
Для того чтобы определить собственную функцию в php, используется следующий синтаксис:
1 2 3 4 |
function имя_функции(набор_параметров) { тело функции (тут непосредственно идёт работа) } |
Имя функции должно начинаться с буквы или знака подчёркивания, после можно использовать буквы, знаки подчёркивания и цифры. Следует так же отметить что имена функций не чувствительны к регистру, поэтому вы можете вызвать функцию strlen() как strlen(), STRlen(), StrleN() и т.д. но лучше так не делать. Все встроенные в php функции (SPL библиотека) принято вызывать в нижнем регистре.
Давайте для наглядности определим свою собственную функцию приветствия:
1 2 3 4 5 |
function sayHello($userName){ echo 'Привет ' . $userName . '!'; } sayHello('Иван'); //функция выведет на экран строку «Привет Иван!» |
В приведённом примере я создал простейшую функцию которая принимает один обязательный параметры $userName (имя пользователя), чтобы затем склеить его со строкой и вывести её на экран. Если не передать аргумент $userName — PHP выведет ошибку.
Область видимости переменных
В определении функций в PHP есть особенность. Все переменные которые определяются и используются внутри функции по умолчанию — локальны для этой функции. Для взаимодействия с внешними переменными необходимо использовать инструкцию global или так называемое замыкание.
Давайте рассмотрим пример:
1 2 3 4 5 6 7 8 |
$number = 123; // глобальная область видимости function showNumber() { echo $number; // ссылка на переменную в локальной области видимости } showNumber(); |
Вызов showNumber() в приведённом примере не даст результата т.к. переменная $number внутри функции локальна и по сути не определена, она не имеет ничего общего с переменной $number с заданным значением 123 до функции.
Если вы хотите использовать $number определённый вначале когда, воспользуйтесь инструкцией global вот так:
1 2 3 4 5 6 7 8 9 |
$number = 123; // глобальная область видимости function showNumber() { global $number; echo $number; } showNumber(); //Выведет 123 на экран |
Однако такой подход таки в себе определённый риск. Когда мы обращаемся из функции к глобальной переменной, мы не можем быть уверен в том, что в ней содержится нужное нам значение. Эту переменную просто могут переопределить (даже по ошибке) ранее в коде и функция отработает не правильно. Помимо использования инструкции global вы можете обратиться к специальной переменной PHP $GLOBALS, где ключом массива будет имя переменной заданной в глобальной области видимости.
1 2 3 4 5 6 7 8 |
$number = 123; // глобальная область видимости function showNumber() { echo $GLOBALS['number']; } showNumber(); //Выведет 123 на экран |
Массив $GLOBALS является суперглобальным массивом так же как и $_GET или $_POST, он доступен в любой области видимости.
Передача по ссылке
В PHP существует возможность передачи переменной по ссылке, в этот случае функция работает с переменной из глобальной области видимости. Это полезно когда в например на сайте создана система событий и нам нужно перехватить ту или иную переменную в рамках события из изменить её значение.
1 2 3 4 5 6 7 8 9 |
$num = 5; //Переменная в глобальной области видимости function increaseNumber(&$number){ //Передача переменной по ссылке $number++; } increaseNumber($num); echo $num; //Выведет 6 |
Обратите внимание, что перед аргументов функции стоит знак & это говорит о том, что к аргументу нужно обратиться по ссылке, по сути сослаться на ту же самую область памяти где была определена передаваемая в качестве аргумента переменная.
Анонимные функции, замыкания
Анонимные функции (лямбда функции) так же известны как замыкания, это функции не имеющие определённых имён. Чаще всего они используются в качестве callback функций передаваемых в качестве аргумента другим функциям, например функциям сортировки, однако их применение на этом не заканчивается. Замыкания могут быть использованы в качестве значения переменных, в этом случае PHP автоматически преобразует их в экземпляр класса Closure.
Например определим функцию sayHello() как анонимную:
1 2 3 4 5 |
$sayHello = function ($userName){ echo 'Привет ' . $userName . '!'; }; $sayHello('Мир'); //Выведет «Привет мир!» |
При помощи анонимных функций можно передать в локальную область видимости переменную определённую в глобальной области используя конструкцию use():
1 2 3 4 5 6 7 |
$userName = 'Мир'; $sayHello = function () use($userName){ echo 'Привет ' . $userName . '!'; }; $sayHello(); |
Подобные конструкции часто применяются при обработке маршрутов. Мы рассмотрим это в рамка других статей. А теперь вы можете выполнить небольшой тест с целью проверки теоретических знаний по функциям PHP:
Please select 3 correct answers
Оставьте первый комментарий!