加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

如何在php中编写一个可以像func(a)(b)(c)一样调用的函数?

发布时间:2020-12-13 21:33:37 所属栏目:PHP教程 来源:网络整理
导读:我需要实现像这样工作的函数“calc”: $sum = function($a,$b) { return $a + $b; };calc(5)(3)(2)($sum); // 10calc(1)(2)($sum); // 3calc(2)(3)('pow'); // 8 我可以这样写: function calc(){; print_r(func_get_args()); return __FUNCTION__;}calc(3)
我需要实现像这样工作的函数“calc”:

$sum = function($a,$b)  { return $a + $b; };
calc(5)(3)(2)($sum);    // 10
calc(1)(2)($sum);       // 3
calc(2)(3)('pow');      // 8

我可以这样写:

function calc(){;
    print_r(func_get_args());
    return __FUNCTION__;
}
calc(3)(5)(2)('sum');

并且它打印数组([0] => 3)数组([0] => 5)数组([0] => 2)数组([0] =>和).

所以,当我在我的函数中得到’sum’时,我应该有一个包含所有先前参数的数组.
但是我不知道,我怎样才能在下一个函数调用中传递当前参数来在最后一次迭代中操作它们.还是有某种递归解决方案?

解决方法

您所谈论的内容称为 Currying.以下代码将需要PHP 7,因为它涉及调用从另一个函数返回的函数,这在该版本中实现PHP的 Abstract Syntax Tree之前是不可能的.

首先,您需要一个可以对任意数量的变量进行操作的新sum()函数:

$sum = function(...$args)  { return array_sum($args); };

其次,重要的部分.一个累积的函数返回一个新的匿名函数,随着它继续累积参数.当你最终传递一些可调用的东西(你的$sum函数,或像pow这样的内置函数名)时,它会执行它,解压缩它构建的参数.

function calc($x)
{
    return function($y = null) use ($x)
    {
        if (is_callable($y)) {
            return $y(...$x);
        } else {
            $args = (array) $x;
            $args[] = $y;
            return calc($args);
        }
    };
}

echo calc(5)(3)(2)($sum); // 10
echo calc(1)(2)($sum); // 3
echo calc(2)(3)('pow'); // 8

见https://3v4l.org/r0emm

(请注意,内部函数将仅限于对它们定义的参数数量进行操作 – calc(2)(3)(4)(‘pow’)将引发错误.)

这不是一个特别常用的模式(这可能是你发现很难追查的原因),所以请为每个阅读它的人请仔细考虑你在哪里使用它.

归功于this question中cu??rryAdd的答案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读