是否有数组可调用函数?

时间:2016-01-05 21:25:09

标签: php dynamic invocation method-invocation

设置

SomeClass内,f2member取两个整数参数并产生其总和。测试通过显示调用实际工作并检索预期结果。通过两个参数$g1返回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下产生一个波浪线:

squiggle line warning in phpStorm

  

函数名必须是可调用的 - 字符串,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。也许,我只是搜索了错误的单词组合,这里只是两个样本:

  • 数组到可调用的php
  • 创建可调用方法句柄php

BigPicture

以防嫌疑人出现这是一个X/Y problem:我有另一个函数将可调用作为参数。使用闭包,定义一些东西是很自然的,可以在以后调用。但是,如何为成员或静态方法定义可调用而不将其包装在另一个委托Closure中?数组表示法允许用于统一传递:闭包或静态/成员方法句柄到我以后的函数。我现在正试图找到一个简洁的解决方案,接近this

2 个答案:

答案 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