PhpStorm - 如何正确输入提示数组键?

Posted

技术标签:

【中文标题】PhpStorm - 如何正确输入提示数组键?【英文标题】:PhpStorm - How to type hint array key correctly? 【发布时间】:2020-03-01 16:37:14 【问题描述】:

关于如何使用 phpDoc 注释数组键仍有一个悬而未决的问题:https://github.com/phpDocumentor/phpDocumentor2/issues/650

我尝试了以下符号:

/**
 * @return array<string, SomeClass>
 * @return SomeClass[string]
 */    
public function someMethod(): array  ... 

但 PhpStorm 似乎无法适当地解决这个问题,因此在使用例如 foreach内部对象未知:

foreach($obj->someMethod() as $some) 
   $some->methodOfSomeClass(); // PhpStorm -> Method not found

我知道我可以使用管道运算符:

@return array<string, SomeClass>|SomeClass[]

我也知道我可以输入提示变量:

/** @var SomeClass $obj */
$obj

但是有没有办法在不使用管道的情况下配置 PhpStorm 以了解数组值类型?

【问题讨论】:

当该数组元素将被使用时(当分配给某个变量时)使用 @var 内联 - 请参阅 Code Spirit 答案.. 或尝试 deep-assoc-completion 插件(它允许对数组参数/返回进行详细描述)--github.com/klesun/deep-assoc-completion/blob/master/README.md "array" -- AFAIK PhpStorm 可能只解析此语法(不显示警告;对此不是 100% 确定)但实际上并不理解它.请参阅youtrack.jetbrains.com/issue/WI-43843 和可能的youtrack.jetbrains.com/issue/WI-20193 自 phpstorm 2020.3 EAP #2 起支持和解析诸如 array 或类型 array 之类的类型 【参考方案1】:

在 PHP 中,您可以使用具有整数键的数字索引数组或具有字符串键的关联数组。由于动态类型,您可以将它们混合在一起,因此可以同时具有两种类型。

此外,在您的示例中,您使用的不是密钥而是值,这些都用ClassName[] 暗示。

/**
 * @return Class[]
 */
function getClasses(): array 
  return [new Class()];

通过这种打字,PHPStorm 将在 forEach 循环中提供有效的工具提示。 否则,您可以使用内联 @type 注释。

foreach ($objs as $obj) 
  /* @type Class $obj */
  $obj->someMethod(); //Is hinted

【讨论】:

以上是关于PhpStorm - 如何正确输入提示数组键?的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用phpstorm9更新提示

如何从每个钢琴键的一个数组中构建正确的和弦?

Netbeans 和 PHPStorm 中的变量类型提示

如何激活phpstorm2016

如何让 PhpStorm 理解 Ds\Map 键类型?

phpstorm中数组格式对齐