php - 如何使用 PHPDoc 对 Callable 的参数进行类型提示?

标签 php phpstorm phpdoc

我有一个接受回调作为参数的方法。我想在 PHPDoc 中为 类方法 提供一个签名,其中概述了要传递给该方法的回调函数 的参数,以便我的 IDE (PHPStorm) 可以为传递给我的方法的函数生成有效的类型提示,或者至少查看代码的人可以确定他们打算提供的回调的签名。

例如:

class Foo {
  public $items = [];
  /**
  * @param Callable(
  *   @param ArrayObject $items The list of items that bar() will return
  * ) $baz A callback to receive the items
  **/
  public function bar(Callable $baz) {
    $items = new ArrayObject($this->items);
    $baz($items);
  }
}

方法bar有一个参数$baz,是一个回调函数。作为参数传递给 bar() 的任何函数都必须接受 ArrayObject 作为其唯一参数。

理想情况下,应该可以为 Callable 包含多个参数,就像任何其他方法一样。

当我写下面的代码时:

$foo = new Foo();
$foo->bar(function(

...然后我应该收到一个参数列表,该列表正确提示此函数调用接受的参数的类型 (ArrayObject)。

这样的事情可能吗? PHPStorm 或其他 IDE 是否支持它?即使没有 IDE 支持,是否有推荐的/标准的记录方法?

最佳答案

PHP 7+:

将可调用接口(interface)与匿名类结合使用就可以了。它不是很方便,并且导致类消费者的代码有点过于复杂,但目前它是静态代码分析方面的最佳解决方案。

/**
 * Interface MyCallableInterface
 */
interface MyCallableInterface{
    /**
     * @param Bar $bar
     *
     * @return Bar
     */
    public function __invoke(Bar $bar): Bar;
}

/**
 * Class Bar
 */
class Bar{
    /**
     * @var mixed
     */
    public $data = null;
}

/**
 * Class Foo
 */
class Foo{
    /**
     * @var Bar
     */
    private $bar = null;

    /**
     * @param MyCallableInterface $fn
     *
     * @return Foo
     */
    public function fooBar(MyCallableInterface $fn): Foo{
        $this->bar = $fn(new Bar);
        return $this;
    }
}

/**
 * Usage
 */
(new Foo)->fooBar(new class implements MyCallableInterface{
    public function __invoke(Bar $bar): Bar{
        $bar->data = [1, 2, 3];
        return $bar;
    }
});

如果您使用的是 PhpStorm,它甚至会在匿名类中自动生成 __invoke - 方法的签名和主体。

关于php - 如何使用 PHPDoc 对 Callable 的参数进行类型提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13649197/

相关文章:

php - 为 PHPUnit 的模拟对象定义类型

php - 在PHP中过滤MySQL数据以仅显示当前 session 用户的数据?

javascript - 将 php 文件的 mime 类型指定为 application/javascript

PHPMD 无法带参数运行

intellij-idea - IDEA IDE - 禁用对一个文件的检查

php - 记录有意切换失败的最佳方法是什么?

php - 如何在PhpStorm中为整个项目更新生成DocBlock?

PHPExcel CSV 到 XLSX

php - 允许管理员成为其他用户的最简单/最安全的方法是什么

PhpStorm 显示空格而不是