关于php7统一变量语法,嵌套函数

时间:2018-09-07 19:59:17

标签: php anonymous-function currying

我正在尝试解决一个使用新功能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

我没有找到有关此功能的任何解释。在哪里可以找到如何使用它?我看到必须在函数测试中返回函数名称,但是如何传递参数?

2 个答案:

答案 0 :(得分:1)

谢谢大家的帮助。就像这样:

<?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

答案 1 :(得分:0)

与rfc相比,这更多的是关于嵌套递归函数或curring的。那个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等乘法函数无法使用空初始值,因此您可以将初始值指定为数组中第一个传递的参数。