如何在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的答案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |