Функциональное программирование и PHP
Сегодня многие говорят о функциональном программировании, но не каждый сможет с уверенностью сказать, что следовал всем принципам данного способа написания программ. Главной причиной этому является наше однонаправленное мышление и обыкновенное незнание. В этой статье мы разберём основные принципы функционального программирования на PHP.
Важные аспекты функционального программирования
Начнём с терминов. Википедия определяет функциональное программирование как “парадигму программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних”. В данном способе программирования главным объектом манипуляции являются функции, в то время как в императивном программировании главным принципом является последовательное выполнение команд для достижения желаемого результата.
Когда я сказал, что главным объектом манипуляции являются функции, я имел в виду, что с ними мы можем делать всё, что угодно: передавать как аргументы в другие функции, определять функции в функциях, использовать функции в качестве возвращаемых значений! В общем, кругом одни функции.
Теперь давайте подойдём ближе к некоторым особенностями функционального программирования.
Неизменность
Свойством неизменности обладают значения, которые не могут быть изменены. В PHP и многих других языках их называют константами.
Рекурсия
Рекурсия - это один из часто используемых приёмов в функциональном программировании. При императивном подходе, для прокрутки по массивам мы можем воспользоваться циклами for или foreach, записывая текущее значение во временную переменную. Из-за принципа “неизменности”, данный подход неприемлем для функционального программирования.
Предположим, что мы хотим получить сумму элементов массива (забудьте о array_sum()). При функциональном подходе, решение данной задачи будет выглядеть так:
<?php function sum($array) { if (empty($array)) return 0; else return $array[0] + sum(array_slice($array, 1)); } $total = sum(array(1, 2, 3)); // 6
Если массив пустой, то сумма элементов будет равна 0. В случае если в массиве больше элементов, мы применяем рекурсию.
Чистые функции
Если функция никаким образом не меняет значения переменных, которые находятся за её пределами и не осуществляет действия по вводу/выводу данных в файл, базу данных и т.д., то такую функцию можно назвать чистой.
Возвращаемое значение чистых функций будет всегда одинаковым для одного и того же набора входящих параметров. В этом случае, мы можем не переживать за работоспособность программы в целом, если заменим вызов чистой функции на вычисленное значение. Все математические функции - это чистые функции, в то время как функции работы с датой и rand() - нет.
Функции высших порядков
Если чистые функции можно реализовать практически при любом подходе, функции высшего порядка - это очень характерная отличительная черта функционального программирования. Особенностью функций высших порядков является то, что они могут принимать в качестве аргументов и возвращать другие функции. В PHP - это лямбда функции и замыкания.
Лямбда функции
Лямбда функции (также известные, как анонимные функции) - это ничто иное, как функции без названия. Работа с подобными функциями осуществляется через переменную, которой данная функция была присвоена.
Возможность создания подобных функций есть во множестве языков. Вы наверняка уже писали их в вашем JavaScript коде, когда реализовывали функции обратного действия при работе с ajax.
$("#myButton").click(function () { // do something });
Приведённый фрагмент кода - это ничто иное, как создание анонимной функции.
В PHP лямбда функции появились в версии 5.3:
<?php $square = function ($arg) { return $arg * $arg; }; $value = $square(2); // 4
Когда речь идёт об анонимных функциях, очень важно понимать область видимости переменных. К примеру, в JavaScript анонимные функции имеют доступ к переменным за их пределами, а в PHP - нет.
Замыкания
Иногда всё же возникает необходимость иметь доступ к какой-то переменной, которая находится за пределами анонимной функции, но не является входящим параметром. Для того чтобы получить доступ к подобным переменным, можно воспользоваться замыканиями, используя ключевое слово use:
<?php $rate = .12; $findInterest = function ($value) use ($rate) { return $value * $rate; }; $interest = $findInterest(100);
В этом случае, мы не передаём переменную как входящий параметр функции, а получаем к ней доступ, используя use.
Каррирование и частичное применение
Функции частичного применения - это функции содержащие другие функции, которые работают с набором аргументов родителя.
В PHP мы можем создавать подобные функции при помощи замыканий. Ниже вы можете найти пример вычисления объёма коробки. Все аргументы являются необязательными. Однако, если передать меньше 3х параметров, то запустится ещё и другая внутренняя функция.
<?php $volume = function ($length = 0, $width = 0, $height = 0) use (&$volume) { $args = func_get_args(); $numArgs = func_num_args(); if ($numArgs == 3) { return $length * $width * $height; } else if ($numArgs < 3) { return function() use(&$volume, $args) { $newArgs = array_merge($args, func_get_args()); return call_user_func_array($volume, $newArgs); }; } else { throw new BadFunctionCallException("Too many arguments"); } };
В первой проверке мы проверяем количество аргументов. Если оно равно 3, то возвращаем результат. Если изначальное количество аргументов меньше, вызываем другую функцию, которая пытается найти решение с заданными данными.
Таким образом, мы можем вычислить размер коробки, передав сначала один аргумент, а потом и другие.
<?php $standardVolume = $volume(10); $vol = $standardVolume(5, 5); // 250
Каррирование - это специальный вид функции частичного применения, когда каждый аргумент может быть принят в отдельную функцию. Что-то типа f(x,y,z) to f(x)(y)(z). В PHP такой синтаксис невозможен, но реализовать принцип можно.
Плюсы и минусы
В использовании функционального подхода есть множество плюсов. К примеру, анонимные функции можно использовать в качестве функций обратного вызова. Как в фрэймворке Slim:
<?php $app = new \Slim\Slim(); $app->get("/home", function () { // show home page });
В данном примере, анонимная функция запустится, когда пользователь зайдёт по адресу home.
При функциональном подходе нужно писать функции, которые выполняют какую-то свою узкопрофильную задачу, не затрагивающую какие-то глобальные вещи. Следуя данной парадигме, ваши программы не будут разбухать.
Однако стоит заметить, что не все приёмы данной парадигмы можно реализовать в PHP. В качестве примера, можно привести работу с параллельными процессами.
Также не всегда можно определить сложность рекурсивной функции и её эффект на производительность кода. Иногда стоит отойти от функционального принципа.
Наверное самым большим недостатком функционального подхода является то, что нужно отказаться от императивного мышления. Если это сделать, то новый подход к программированию может даже и увлечь.
Итог
Функциональное программирование - это больше, чем просто подход. Это больше способ мышления, причём вне зависимости от языка.
Источник: http://feedproxy.google.com/~r/ruseller/CdHX/~3/X8c6pB8_MOE/lessons.php
Дайджест новых статей по интернет-маркетингу на ваш email
Новые статьи и публикации
- 2024-11-26 » Капитан грузового судна, или Как начать использовать Docker в своих проектах
- 2024-11-26 » Обеспечение безопасности ваших веб-приложений с помощью PHP OOP и PDO
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-15 » Перенос сайта на WordPress с одного домена на другой
- 2024-11-08 » OSPanel 6: быстрый старт
- 2024-11-08 » Как установить PhpMyAdmin в Open Server Panel
- 2024-09-30 » Как быстро запустить Laravel на Windows
- 2024-09-25 » Next.js
- 2024-09-05 » OpenAI рассказал, как запретить ChatGPT использовать содержимое сайта для обучения
- 2024-08-28 » Чек-лист: как увеличить конверсию интернет-магазина на примере спортпита
- 2024-08-01 » WebSocket
- 2024-07-26 » Интеграция с Яндекс Еда
- 2024-07-26 » Интеграция с Эквайринг
- 2024-07-26 » Интеграция с СДЕК
- 2024-07-26 » Интеграция с Битрикс-24
- 2024-07-26 » Интеграция с Travelline
- 2024-07-26 » Интеграция с Iiko
- 2024-07-26 » Интеграция с Delivery Club
- 2024-07-26 » Интеграция с CRM
- 2024-07-26 » Интеграция с 1C-Бухгалтерия
- 2024-07-24 » Что такое сторителлинг: техники и примеры
- 2024-07-17 » Ошибка 404: что это такое и как ее использовать для бизнеса
- 2024-07-03 » Размещайте прайс-листы на FarPost.ru и продавайте товары быстро и выгодно
- 2024-07-01 » Профилирование кода в PHP
- 2024-06-28 » Изучаем ABC/XYZ-анализ: что это такое и какие решения с помощью него принимают
- 2024-06-17 » Зачем вам знать потребности клиента
- 2024-06-11 » Что нового в работе Яндекс Метрики: полный обзор обновления
- 2024-06-11 » Поведенческие факторы ранжирования в Яндексе
- 2024-06-11 » Скорость загрузки сайта: почему это важно и как влияет на ранжирование
Чтобы вырастить плодоносящий сайт - его полезно регулярно поливать и удобрять с помощью рекламы и оптимизации Компания "RedLine" |
Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.