可以通过使用反射来确定一个函数接受多少个参数。
我希望能够定义一个执行函数组合的函数 compose
。也就是说,compose($f, $g)
应该生成一个返回 $f($g($x))
的新函数。
我这里有一个示例实现:
function compose()
{
$fns = func_get_args();
$prev = array_shift($fns);
foreach ($fns as $fn) {
$prev = function ($x) use ($fn, $prev) {
$args = func_get_args();
return $prev(call_user_func_array($fn, $args));
};
}
return $prev;
}
在组合$f
和$g
时,$g
的元数可能大于1。这意味着它可以取多个争论。因此,compose($f, $g)
返回的函数也可能采用多个参数——它采用与 $g
完全相同的参数。
此实现的问题在于无法控制compose
返回的公开数量。在这种情况下,它总是 1
,因为 function ($x) ...
。当尝试使用反射确定元数时,它将始终返回 1
而不是 $g
。
有没有办法在不使用 eval
和其他代码生成技术的情况下更改 PHP 反射系统看到的匿名函数的参数数量?
最佳答案
当您将 func_get_args()
引入函数时,任何能够确定其真正元数的希望都将失效。此时,元数实际上仅由函数的逻辑定义,不能通过反射或静态代码分析来确定。
我之前写过一个类似于 compose
的实现,但它只是假设你正在组合的函数的元数都是 1。
关于php - 在没有代码生成的情况下定义匿名函数的元数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20022372/