0

环境

其中SomeClassf2member两个整数参数并产生其总和。测试通过,表明调用确实有效并检索到了预期的结果。$g使用两个参数调用11返回2.

重要提示:这仅适用于 php 5.4.11 及更高版本的 兼容性检查

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

phpStorm 中的波浪线警告

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

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

试图

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

/**
 * @param array $arr
 *
 * @return callable
 */
function callable_for($arr)
{
    return $arr;
}

这将返回一个数组,但也明确地告诉类型系统callable_for函数的结果。有了这个类型注释,phpStorm 现在停止抱怨这个警告,尽管它仍然返回一个数组。

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

问题

难道没有像我在 php 中那样开箱即用的东西callable_for来实现这一点吗?如果答案是否定的,那么我正在寻找我们能找到的最简洁的解决方案。

我已经尝试过查看 SO、php.net和 google。也许,我只是搜索了错误的单词组合,这里只是两个示例:

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

大图

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

4

2 回答 2

0

这个问题是四年前提出的,但经过一些研究,我发现了 Closure::fromCallable 方法:https ://www.php.net/manual/de/closure.fromcallable.php

于 2020-01-21T08:22:24.637 回答
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');

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

于 2016-01-05T21:25:08.980 回答