Как привязать make Currying к PHP? (как Function.prototype.bind сделать в javascript)?

#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)