php - 在没有代码生成的情况下定义匿名函数的元数

标签 php

可以通过使用反射来确定一个函数接受多少个参数。

我希望能够定义一个执行函数组合的函数 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/

相关文章:

php - MYSQL - 使用 Group BY 获取当前项目的巨大问题

php - session ID 散列是否比普通存储更安全?

php - Laravel 5.2 上的工厂未按预期工作

php - wpdb::prepare() 的查询参数必须有一个占位符

php - 如何在 Zend2 中访问另一个命名空间中的模型?

php - while($row = mysql_fetch_array($query)) 第二次不起作用

javascript - Jquery 清除/重置我填写的表单

simplexml - PHP simplexml 实体

php - 我似乎无法弄清楚为什么这个查询给我错误

php - 组合数组字符串值并丢弃数组元素