Функциональное программирование - Как составлять функциональный код на PHP
Функциональное программирование можно определить, как парадигмы программирования, которые не меняют состояние программы, а вместо этого используют чистые функции. Чистая функция - это функция, которая может принимать значения и возвращать обработанные данные, не изменяя входящих данных.
Ее характерной особенностью является способность поддерживать функции более высокого порядка. Это значит, что эти функции принимают результаты вычислений от других функций и передают им данные после обработки.
Кроме того, функциональное программирование поддерживает системы, которые разработаны в естественной среде, что решает проблему нулевых указателей, которая является серьезным препятствием в объектно-ориентированном программировании.
Парадигма программирования заключается в том, что функционал имеет следующие атрибуты: не изменяет состояние, что упрощает осуществление распараллеливания; в основном взаимодействует с функциями, которые являются минимальными единицами кода, что делает весь код более читаемым; работает с детерминированными функциями, что способствует стабильности программы.
Как PHP реализует функциональное программирование
PHP имеет следующие характеристики, которые обеспечивают поддержку функционального программирования. А именно:
Анонимные функции или лямбда-функции
Это функции, которые используют во время их реализации внутренний замкнутый класс. В PHP 5.3.x они используют функцию Invoke (). В PHP 5.4.x анонимная функция может быть определена внутри класса, однако для доступа к свойствам и методам этого класса она использует такие переменные, как $this.
В основном они представляют собой классы, которые не содержат имен. Функция может работать с теми значениями, которые были заданы во время определения функции.
Замыкание
По определению замыкание похоже на анонимную функцию, однако разница заключается в том, что замыкание включает и некоторые части окружающего кода (расширенный диапазон действия).
С тех пор, как PHP использует по умолчанию раннее привязывание, значения из расширенного диапазона могут быть видны для функции через применение последующего привязывания.
Это осуществляется путем передачи по ссылке переменных из-за пределов диапазона, что реализуется через применение ключевых фраз.
Например:
$variable = 10;
// Create a closure using a variable outside of the scope of the anonymous function.
$closure = function($arg) use ($variable) {
Return $arg + $variable;
};
Частичные функции и отделение
В РНР частичная функция является производной от общей функции, которая имеет множество переменных. Частичная функция имеет возможность фиксировать большинство переменных из общей функции.
Данное взаимодействие может быть реализовано с использованием замыкания следующим образом.
$general_function = function ($a, $b) {
Return $a * $a - $b * $b;
};
$partial_function = function ($a) use ($general_function) {
Return $general_function ($a, 5);
};
Отделение – это техника, которая принимает один аргумент, может быть создана функционалом, оперирующим несколькими аргументами. Например:
$add2 = curry($add, 2); //returns a new function reference, to add(), bound with 2 as the first argument
$add2 (8); // return 10
Отделение не является функцией PHP, но может быть создано ею.
Функции высшего порядка
Функции высшего порядка - это функции, которые способны принимать другие функции, в качестве входящих параметров. Количество параметров входящей функции должно быть тем же, что и у функции высшего порядка.
И точно то же количество параметров должно быть на выходе. Функции высшего порядка реализуются через замыкание и лямбда-функции.
Чистые функции, неизменные данные
Данный класс функций очень не просто реализовать через PHP. Чтобы сделать это нужно избегать изменений состояния и данных. В PHP чистые функции реализуются с помощью применения переменных, глобальных или статических, но эти переменные не изменяют входящие или исходящие данные. PHP также реализует неизменные данные, определяя свои переменные в качестве констант.
Рекурсия
Это техника программирования, которая подразумевает решение одной проблемы, исходя из решений других, более мелких проблем. Однако эти более мелкие проблемы должны быть того же характера, что и глобальная.
Рекурсии используется для того, чтобы поддерживать стабильное состояние системы и предотвратить изменение данных. Рекурсия реализуется не через структуру, а с помощью вызова функций.
Преимущества:
Функциональное программирование имеет много преимуществ, которые решают проблемы программирования на PHP, однако не все они могут быть реализованы через PHP, так как функциональное программирование не является языком программирования, предназначенным для создания функций при проектировании.
Вот некоторые из этих преимуществ:
- Обращение: анонимные функции могут обращаться к элементам, которые могут быть использованы в последующем;
- Безопасные программы: достигается за счет использования неизменных данных и поддержания стабильного состояния, программа разделена на отдельные функции, что делает более простым ее редактирование и улучшение;
- Повторное использование кода: достигается за счет рекурсии, которая использует существующее решение проблемы для решения других проблем.
Недостатки
- Затратность: рекурсии влекут за собой затраты ресурсов, таких как дисковое пространство и время, что снижает эффективность системы;
- Функциональное программирование более сложно в изучении по сравнению с императивом, поскольку оно предлагает инструменты для нового решения старых проблем.
В заключение можно отметить, что функциональное программирование это не только парадигма программирования, поскольку оно рассматривает взаимодействие функций и их организацию без необходимости принятия конкретных шагов по их применению.
Для решения прикладных проблем требуется его реализация через отдельный язык программирования. Такой, например, как PHP.