О php7 Синтаксис единой переменной, вложенные функции - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь решить задачу, в которой используются новые функции 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 голосов
/ 08 сентября 2018

Это больше о вложенных рекурсивных функциях или карри, чем этот 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, не будут работать с нулевым начальным значением, вы можете указать начальное значение в качестве первого переданного параметра из массива.

0 голосов
/ 08 сентября 2018

Спасибо всем за помощь. Это примерно так:

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