Я пытаюсь решить задачу, которая использует новые функции php7 синтаксиса единой переменной поддержки nested () foo()()
(https://wiki.php.net/rfc/uniform_variable_syntax).
Мне нужно написать тест функции для этого кода:
$sum = function($a, $b) { return $a + $b; };
test(6)(2)(3)($sum); // 11
test(3)(1)($sum); // 4
test(3)(3)('pow'); // 27
Я не нашел объяснения этой функции. Где я могу найти, как его использовать? Я вижу, что должен возвращать имя функции в тесте функции, но как передать аргумент?
Спасибо всем за помощь. Это что-то вроде этого:
<?php
function test($a) {
echo '<br/>';
$arr[] = $a;
return $mf = function($b) use(&$mf, &$a, &$arr) {
if(gettype($b) == 'object') {
echo(array_reduce($arr, $b));
} elseif (gettype($b) == 'string') {
if($b == 'pow') {
echo array_reduce($arr, function ($carry, $a) {
return !empty($carry) ? pow($carry, $a) : $a;
});
}
} elseif (gettype($b) == 'integer') {
$arr[] = $b;
}
return $mf;
};
}
$sum = function($a, $b) { return $a + $b; };
test(6)(2)(3)($sum); // 11
test(3)(1)($sum); // 4
test(3)(3)('pow'); // 27
Это больше о вложенных рекурсивных функциях, или карри, чем этот rfc. Этот rfc просто включил синтаксис, который его поддерживал.
Это использует рекурсию, пока вы не передадите вызываемый:
function test($var) {
$values = [$var];
$function = function($callback) use (&$values, &$function) {
if (is_callable($callback)) {
return array_reduce(array_slice($values, 1), $callback, $values[0]);
}
$values[] = $callback;
return $function;
};
return $function;
}
Поскольку ваши функции ожидают два параметра, а вложения могут иметь неограниченные параметры, лучше использовать массив и сокращение массива.
Однако, поскольку функции умножения, такие как pow, не будут работать с нулевым начальным значением, вы можете указать начальное значение в качестве первого переданного параметра из массива.