Php 是否存在可调用函数的数组? 背景

Php 是否存在可调用函数的数组? 背景,php,dynamic,invocation,method-invocation,Php,Dynamic,Invocation,Method Invocation,在SomeClass中有f2member获取两个整数参数并生成其和。测试通过,显示调用实际工作并检索预期结果。它调用$g,使用两个参数1和1返回2 重要提示:这仅适用于php 5.4.11及以上版本 问题 但是,这会在每次方法调用时在phpStorm内部生成一条警告,并在$g下生成一条曲线: 函数名必须是可调用的-字符串、闭包或实现调用的类,当前为数组 我很清楚这个警告的由来,现在我正在寻找避免这些警告的方法。 一个要求是,我不想改变调用函数的方式。我不想做的另一件事是停用此警告。 我更愿意在

SomeClass
中有
f2member
获取两个整数参数并生成其和。测试通过,显示调用实际工作并检索预期结果。它调用
$g
,使用两个参数
1
1
返回
2

重要提示:这仅适用于php 5.4.11及以上版本

问题 但是,这会在每次方法调用时在phpStorm内部生成一条警告,并在
$g
下生成一条曲线:

函数名必须是可调用的-字符串、闭包或实现调用的类,当前为数组

我很清楚这个警告的由来,现在我正在寻找避免这些警告的方法。 一个要求是,我不想改变调用函数的方式。我不想做的另一件事是停用此警告。 我更愿意在它周围包装一些东西,这为类型系统提供了必要的信息

企图 我已经遇到了几种删除警告的解决方案。一种是定义一个用户定义的函数,它只记录所需的目标类型

/**
 * @param array $arr
 *
 * @return callable
 */
function callable_for($arr)
{
    return $arr;
}
这将返回一个数组,但也会显式地告诉类型系统函数的
callable_中会产生什么。使用此类型注释后,phpStorm现在不再抱怨此警告,尽管它仍然返回一个数组

$g = callable_for(array($this,'f2member'));
问题: 在php中是否有像my
callable\u for
这样的现成工具来实现这一点?如果答案是否定的,那么 我正在寻找我们能找到的最简洁的解决方案

我已经试过了,谷歌。也许,我只是搜索了错误的单词组合,这里只有两个示例:

  • 数组到可调用php
  • 创建可调用的方法句柄php
大图
以防万一,这是一个:我有另一个函数,它把一个可调用函数作为参数。对于闭包,定义一些东西是很自然的,以后可以调用这些东西。但是,如何定义成员或静态方法的可调用项,而不将其包装在另一个委托闭包中?数组表示法允许将:闭包或静态/成员方法句柄统一传递给我以后的函数。我现在正试图找到一个简洁的解决方案,它接近于。

因此,另一个进步可能是,修改
callable_for
以接受两个参数并包装两个职责;创建数组并记录目标返回类型

/**
 * @param mixed $context
 * @param string $method
 *
 * @return callable
 */
function callable_for($context, $method)
{
    return array($context, $method);
}
使用此实现将
$g
声明的简洁性提高到可接受的水平

$g = callable_for($this,'f2member');

此函数仍然返回一个数组,但类型系统可以使用给定的信息正确处理此数组以进行动态方法调用。

这个问题是四年前提出的,但经过一些研究,我发现Closure::fromCallable method:

此函数返回一个数组,不是可调用的。@Pamblam我更新了问题以反映我知道这会返回一个数组,但也增加了这种看起来笨拙的设置的动机。我删除了我的答案,显然我不理解你的问题,但作为对你其他评论的答复,如果您愿意发布一个这样的示例,我很想看看如何调用数组。@Pamblam没有人是完美的,只需在问题中给定的phpunit测试上运行phpunit。此赋值中的数组
$g=array($this,'f2member')
将被转换成一些东西,可以将参数列表传递给它,当对其调用
$g(1,1)
时,它应该按预期进行计算。然后返回
2
,让测试用例中的断言通过。或者直接打。然而,从右边的链接答案中,我得到的信息是,这种风格可能不受欢迎。哇,太酷了,谢谢分享。。我很抱歉怀疑您:p但是,如果您查看3v4l,它显示了与php相同的错误
$g = callable_for($this,'f2member');