在SomeClass
内,f2member
取两个整数参数并产生其总和。测试通过显示调用实际工作并检索预期结果。通过两个参数$g
和1
返回1
来调用2
。
重要提示:这仅适用于php 5.4.11及更高版本 compatibility check
class SomeClass extends PHPUnit_Framework_TestCase
{
function f2member($a,$b)
{
return $a + $b;
}
/**
* @test
*/
public function test()
{
$g = array($this,'f2member');
$this->assertEquals(2, $g(1,1)); // squiggle line under $g
}
}
但是,这会在每个方法调用的phpStorm内部产生一个警告,并在$g
下产生一个波浪线:
函数名必须是可调用的 - 字符串,Closure或实现__invoke的类,当前是数组
警告的起源对我很清楚,现在我正在寻找避免这些警告的方法。 一个要求是,我不想改变调用函数的样式。我不想做的另一件事是停用此警告。 我宁愿在它周围包装一些东西,它为类型系统提供了必要的信息。
我已经遇到了几个删除警告的解决方案。一种是定义用户定义的函数,该函数仅记录所需的目标类型。
/**
* @param array $arr
*
* @return callable
*/
function callable_for($arr)
{
return $arr;
}
这会返回一个数组,但也会明确告诉类型系统callable_for
函数的内容。有了这种类型的注释,phpStorm现在停止抱怨这个警告,虽然它仍然返回一个数组。
$g = callable_for(array($this,'f2member'));
开箱即用的东西就像我在php中的callable_for
一样可以实现这一目标吗?如果答案是否定的,那么
我正在寻找我们能找到的最简洁的解决方案。
我已经尝试过搜索,php.net和Google。也许,我只是搜索了错误的单词组合,这里只是两个样本:
以防嫌疑人出现这是一个X/Y problem:我有另一个函数将可调用作为参数。使用闭包,定义一些东西是很自然的,可以在以后调用。但是,如何为成员或静态方法定义可调用而不将其包装在另一个委托Closure中?数组表示法允许用于统一传递:闭包或静态/成员方法句柄到我以后的函数。我现在正试图找到一个简洁的解决方案,接近this。
答案 0 :(得分:0)
因此,另一个进步可能是,修改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');
此函数仍返回一个数组,但类型系统可以使用给定的信息正确处理此数组以进行动态方法调用。
答案 1 :(得分:0)
这个问题是四年前提出的,但是经过一番研究,我发现了Closure :: fromCallable方法:https://github.com/Kentico/ems-mvc-components/wiki/Implementing-Rich-text-editor-plugins