gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:03:49 29 4
gpt4 key购买 nike

我有一个接受回调作为参数的方法。我想在 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com