Пусть у меня есть анонимная функция
$add = function($a, $b) {
return $a + $b;
};
Как можно реализовать функцию curry
, такую, что:
$add5 = curry($add, [5]);
echo $add5(3); // Выведет 8
echo $add5(5); // Выведет 10
Для этих целей можно использовать функции call_user_func_array
, func_get_args
и немного магии замыканий.
Например так:
function curry(callable $func, array $args) {
// Создаем новую анонимную функцию, связывая исходную функцию и
// массив "зафиксированных" аргументов через замыкание.
return function () use ($func, $args) {
// Вызываем исходную функцию и возвращаем ее результат.
return call_user_func_array(
$func,
// Объединяем "зафиксированные" аргументы с теми, что
// будут переданы в каррированную функцию.
array_merge($args, func_get_args())
);
};
};
$add = function($a, $b) {
return $a + $b;
};
$add5 = curry($add, [5]);
echo $add5(3); // 8
echo $add5(5); // 10
Оригинал: Еще раз о каррировании и частичном применении в PHP
Код:
<?php
function curry($callback, $args = array()){
/* $callback - исходная функция
$args - массив ее аргументов, если они уже определены */
/* строим каррированную функцию */
$ret = function() use($callback, $args){
/* определяем число аргументов исходной функции */
$func = new ReflectionFunction($callback);
$num = $func->getNumberOfParameters();
/* добавляем новые аргументы к уже имеющемуся набору */
$args = array_merge($args, func_get_args());
/* если уже набралось необходимое число аргументов, */
if(count($args) >= $num){
/* то подставляем их в исходную функцию
и возвращаем результат вычисления */
return call_user_func_array($callback, $args);
}
/* если же аргументов меньше, чем необходимо, */
else {
/* то рекурсивно вызываем каррирование исходной функции
с более полным набором аргументов */
return curry($callback, $args);
}
};
return $ret;
}
function add($a, $b) { return $a + $b; }
$add = curry("add");
$inc = $add(1);
$dec = $add(-1);
var_dump($inc(6)); // выведет 7
var_dump($dec(8)); // выведет 7
// PHP7
var_dump($add(1)(2)); // выдает 3
Тест: http://sandbox.onlinephpfunctions.com/code/ec8117e986022b355a19ff0f259623b0d2859df1
Виртуальный выделенный сервер (VDS) становится отличным выбором
Я заметил, что в файле web/appphp дистрибутива Symfony Standard Edition есть следующая конструкция:
Есть 2 переменных которых получаем из формы называются они $start_date и $end_dateЕсть запрос к базе
Делаю сайт для поиска посылокВсе готово, но надо сделать страницу админки, где можно будет изменять статус посылки