PHP: Что такое функция
PHP функция предоставляет код, который PHP-скрипт может вызвать для выполнения задачи, такой как
count()
,file_get_contents()
, иheader()
. Язык программирования PHP поддерживает как процедурную, так и объектно-ориентированную парадигмы программирования. В процедурном пространстве функции являются ключевым строительным блоком для разработки и поддержки приложений.
Какую роль PHP функции играют в разработке
Использование функций помогает оптимизировать разработку за счёт:
- Внедрения модульного подхода к разработке.
- Предоставление логики, которую можно повторно использовать в других приложениях.
- Отрицание необходимости заново разрабатывать и переписывать одну и ту же логику снова и снова.
Функции в PHP могут быть встроенными или определяемыми пользователем:
- Встроенные PHP функции поставляются со средами выполнения PHP и их расширениями, и их можно вызвать из любого места скрипта (например,
print()
,var_dump()
,mysql_connect()
и т. д.). - Пользовательские функции — функции создаваемые разработчиком в своём приложении (или сторонних библиотеках).
Независимо от того, является ли функция встроенной или определяемой пользователем:
- Вызываемые функции всегда должны начинаться с ключевого слова
function
. - PHP-код функции должен быть заключён в фигурные скобки.
{
}
. - Имя функции должно начинаться с буквы или подчёркивания, с не с цифры. (Имена функций начинающихся с подчёркивания, обычно зарезервированы для суперглобальных переменных, которые содержат такую информацию, как сессия или cookie)
- Их имена не чувствительны к регистру.
Сколько функций в PHP
В PHP содержится около 700 функций используемых для разнообразных задач.
Примеры PHP функций
Пример PHP функции: Определения и Атрибуты
Имея вышеописанное определение, давайте рассмотрим некоторые определения и атрибуты функций:
<?php
function x5($number)
{
return($number * 5);
}
$multiple_number = x5(10); // 50
Выше приведён полный сценарий, хотя он короткий и простой. Это конкретная функция просто возвращает значение, с которым была вызвана функция, умноженное на пять. Вне определения функции мы видим вызов функции. Функция вызывается просто путём ссылки на функцию и последующего представления аргументов функции в круглых скобках.
Ключевое слово function
начинает определение функции. В данном случае имя функции x5
. Переменные в скобках указывают аргументы функции и то, как на них будут ссылаться внутри функции. В этом случае есть один аргумент, на который будет ссылаться переменная $number
внутри функции. (Позже мы поговорим о необязательных аргументах и области видимости переменных).
Пример PHP функции: Необязательные Аргументы
Давайте рассмотрим пример PHP функции с необязательными аргументами:
<?php
function optionalDemo($greeting, $count = 1)
{
for ($i = 0; $i < $count; $i++)
{
echo $greeting. "\n";
}
}
optionalDemo("Hello");
optionalDemo("Good Bye" , 2);
Как и в предыдущем примере, это полный сегмент кода. Выражение на котором нужно сосредоточиться, — это определение функции. Обратите внимание, что эта функция ожидает два аргумента, на которые внутри функции будут ссылаться как $greeting
и $count
. Кроме того, обратите внимание, что второму параметру, Scount
, присвоено значение по умолчанию 1
. Это работает следующим образом: если функция вызывается с одним параметром (как, при первом вызове функции), то второму параметру будет присвоено значение по умолчанию 1
. Это, в свою очередь, приведёт к однократному выполнению цикла for
внутри функции.
Во втором вызове optionalDemo
предоставляются два значения. Поэтому значение, указанное в вызове, используется для второго аргумента ($count
), а не значение по умолчанию в определение функции. В результате цикл внутри функции выполниться дважды.
Пример PHP функции: Область видимости переменных
Изучая функции, важно понимать концепцию области видимости переменных. Проще говоря, поведение области действия переменных по умолчанию заключается в том, что переменные должны быть ограничены функцией, в которой они определены. Опять, пример — лучший способ продемонстрировать:
function scopedemo($fruit)
{
$fruit = 20;
echo $fruit; // 20
}
$fruit = 10;
scopedemo($fruit);
echo $fruit; //10
В этом примере показано определение функции, а также вызов функции. Следует отметить, что переменная с именем $fruit
используется как внутри, так и вне функции, что заставляет подумать, что она представляет одно и то же значение (например, одну и ту же область памяти), но это не так.
Как показывают комментарии в приведённом выше коде, $fruit
внутри функции представляет другое значение/область памяти, чем $fruit
вне функции. Если вы хотите получить доступ к одному и тому же значению/области памяти внутри и вне функции, можно использовать ключевое слово global
.
Глядя на приведённый выше пример, если бы оператор global $fruit
был добавлен в определение функции, то ссылка на него внутри функции была бы тем же значением или областью памяти вне функции. Итак, в этом случае $fruit
внизу пример кода будет иметь значение 20
.
Пример PHP функции: Переменные как Ссылка
Наконец, переменные могут быть переданы в качестве ссылки. Передача по ссылке приводит к добавлению новой записи в таблицу символов PHP, которая ссылается на внутреннюю структуру данных, содержащую тип и значение переменной. Рассмотрим приведённый выше пример в последний раз. Если бы вызов scopedemo
использовал амперсанд &
перед переменной (например, scopedemo(&$fruit)
), то внутри функции в таблицу символов была бы добавлена новая запись для той же структуры данных, представляющей значения переменных. Это, по сути, ограничивает область действия переменной как внутри, так и вне функции.
Пример PHP функции: Рекурсия
Более продвинутый атрибут функций — рекурсия. Рекурсия — это когда функция пишется так, чтобы она могла сама себя вызывать. Рекурсивная функция должна содержать конечное условие приводящее к завершению функции.
Как правило, при написании рекурсивной функции будет базовый случай
проверяющийся внутри функции, и функция будет продолжать вызывать сама себя до тех пор, пока базовый случай
не будет удовлетворён. Примеры рекурсивной функции включают вычисление факториалов и чтение дерева файлов и/или каталогов. Вот пример того, как будет выглядеть код.
function factorial($n) {
if ($n < 2) {
return 1;
} else {
return ($n * factorial($n - 1));
}
}
Пример PHP функции: Анонимные Функции
Последний атрибут, который мы рассмотрим, — это анонимная функция. Хотя определение анонимной функции такое же, как у определяемой пользователем функции, а именно то, что она принимает аргументы, работает с переменными и содержит логику кода, функция не имеет имени и заканчивается точкой с запятой. Это связано с тем, что в отличие от обычных функций представляющих собой конструкцию кода, анонимная функция представляет собой выражение.
Рассмотрим более ранний пример, представленный в виде анонимной функции:
function($number)
{
return($number * 5);
};
Код этой анонимной функции никогда не будет вызван. Точка с запятой в конце определения гарантирует, что функция рассматривается как выражение. Поскольку она обрабатывается как выражение, её можно присвоить переменной и вызывать путём ссылки на переменную. Её так же можно передать другой функции, что делает анонимную функцию — функцией обратного вызова (callback функцией).
Ещё одно замечание по поводу анонимных функций заключается в том, что они могут быть возвращены из другой функции. Это называется замыканием (closure).
Пример PHP функции: Новый синтаксис анонимной функции
В PHP 7.4 был представлен новый синтаксис анонимной функции:
$double = fn($param1) => 2*$param1;
Использование стрелочной функции (=>
) позволяет использовать сокращённую форму записи замыкания для создания однострочных функций. Это полезно при написании более компактного кода.
Также обратите внимание, что ключевое слово return
необязательно для одиночных выражений. В приведённом выше примере возвращается 2*$param1
.
Анонимные функции наиболее полезны в качестве значений параметров обратного вызова, но у них есть и другие варианты использования. Это одноразовый функции, когда вам нужна функция, которую вы хотите использовать только один раз.
PHP Функции и методы: В чём разница
В начале этой статьи я упомянул, что в процедурном мире PHP функции похожи на то, что объектно-ориентированные разработчики называют методами. Давайте посмотрим на последний пример:
class car
{
public $make;
private $model;
function __construct($make, $model)
{
$this->make = $make;
$this->model = $model;
}
function printMake()
{
echo $this->make . "\n";
}
}
$mustang = new car("Ford", "Mustang");
$mustang->printMake();
$camaro = new car("Chevrolet", "Camaro");
$camaro->printMake();
/*
Ford
Chevrolet
*/
Посмотрите на выделенную часть приведённого выше кода. Обратите внимание, что хотя мы находимся в определении класса, ключевое слово function
определяет то, что объектно-ориентированные разработчики называют методом. Так что на самом деле метод может быть назван другим именем — функция.
Как и функции, методы могут работать с аргументами и содержать блоки кода.
Однако в объектно-ориентированном мире:
- Методы работают со значениями, содержащимися в копии класса (называемой объектом).
- В методе может быть несколько итераций одного и того же определения класса в разных переменных (или даже в массивах объектов).
Вывод заключается в том, что определение метода следует тому же формату, что и определение функции, обсуждаемое в этом блоге.