#php #function #anonymous
#php #функция #Аноним
Вопрос:
я хочу https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind#Currying в PHP:
$x = function ($a, $b) {
echo $a . ' ' . $b;
};
for ($i= 0;$i< 10;$i ) {
$y = bind($x, $i)// how?
$y($i);
}
Ответ №1:
Фактическое каррирование, возможно, немного растянуто для PHP (;-)), тем не менее, вы можете делать подобные вещи с замыканиями в PHP 5.3 :
function populatedList() {
$args = func_get_args();
return function () use ($args) {
$localArgs = func_get_args();
return array_merge($args, $localArgs);
};
}
$sevenList = populatedList(7, 14, 21);
var_dump($sevenList('foo', 'bar', 'baz'));
// Array
// (
// [0] => 7
// [1] => 14
// [2] => 21
// [3] => foo
// [4] => bar
// [5] => baz
// )
Комментарии:
1. Не совсем. Я полагаю, что если кто-то использует такой шаблон, это было бы lithify.me .
Ответ №2:
Возможно, анонимные функции — это то, что вы ищете?
Пример:
<?php
$greet = function($name)
{
printf("Hello %srn", $name);
};
$greet('World');
$greet('PHP');
?>
Комментарии:
1. да, это так, особенно с использованием ключа «use» $someVar = 1; $greet = функция ($name) user (amp;$greet) { …
Ответ №3:
В функциональной библиотеке php есть класс для каррирования (из документов):
Поскольку PHP допускает необязательные параметры, вы можете решить, хотите ли вы использовать их curry или нет. По умолчанию их не нужно обрабатывать.
use function Functionalcurry; function add($a, $b, $c = 10) { return $a $b $c; } // Curry only required parameters, the default, $c will always be 10 $curriedAdd = curry('add', true); // This time, 3 parameters will be curried. $curriedAddWithOptional = curry('add', false);
Начиная с PHP7 и реализации «Uniform variable syntax», вы можете значительно упростить использование функций curried.
use function Functionalcurry; function add($a, $b, $c, $d) { return $a $b $c $d; } $curriedAdd = curry('add'); $curriedAdd(10)(5)(27)(10); // -> 52
Ответ №4:
Начиная с php5.3, вы можете использовать ключевое слово «use» для передачи аргумента curried в область возвращаемой функции:
$add = function ($a) {
return function ($b) use ($a) {
return $b $a;
};
};
var_dump($add(2)(3)); // int (5)