【问题标题】:PHPDoc: Typehint in nested arrays (with e.g. 2 dimensions)PHPDoc:嵌套数组中的类型提示(例如二维)
【发布时间】:2013-12-30 20:06:03
【问题描述】:

是否有正确的方法来记录另一个维度内的数组中的值/对象?

通常会这样处理数组:

/** @var ClassName[] $Array */
$Array = array( $InstanceOfClassName,.. )

但我需要这样的东西:

/** @var ClassName[][] $Array */
$Array = array( 0 => array( $InstanceOfClassName,.. ) )

这显然行不通,那么正确的 PHPDoc 表示法是什么?

【问题讨论】:

  • 注意:我的IDE是PhpStorm ..也许有具体的解决方案? ;-)

标签: php arrays phpdoc code-documentation


【解决方案1】:

PhpStorm 允许使用双括号 [][] 键入提示嵌套数组:

/** @var \SplFileInfo[][] $doubleNestedArray */
$doubleNestedArray = [[]];

$doubleNestedArray[0][1]->getFileInfo(); // ->getFileInfo() is suggested by IDE

【讨论】:

  • 在 PhpStorm 中,您还可以使用管道分隔符指定多种类型,例如:@var \Traversable|array[]|\SplFileInfo[][]|string[][] $doubleNestedArray
  • 这太棒了!您也可以添加更多嵌套 - 例如@var 数组[][][][] $myArray
  • 值得注意的是,PHPDoc 会将其输出为一维数组 (\SplFileInfo[])。在我看来,准确的内联文档和 IDE 补全比准确生成的文档输出有用得多,所以这仍然是一个非常有用的技巧。
【解决方案2】:

首先,了解@var 的这种用法不是标准的phpDocumentor 规范。这是不同 IDE 尝试使“局部变量自动完成”成为可能的几种不同方式之一。我知道 Eclipse 使用/* @var $varName \ClassName */ 格式。因此,在出现其他答案/建议时请记住这一点。

我认为利用二维数组利用这个 IDE 自动补全技巧的唯一方法是稍后在读取第一个维度时使用另一个 @var,尽管这确实需要这样做进入变量本身:

/* @var $outer array */
$outer = array( 0 => array($InstanceOfClassName,...));

/* @var $inner ClassName[] */
$inner = $outer[0];

$inner[0]-> (此处需要自动完成 ClassName 方法)

再说一次,这对自动完成有多大用处取决于您的 IDE 是如何构建它的。一些 IDE 可能知道 ClassName[] 语法并推断从 $inner 提取的元素是 ClassName,因此它可以显示其方法。但是,我不能说我已经看到 任何 IDE 这样做了。最多,看到 IDE 只是以最基本的形式 (/* @var $var ClassName */) 提供@var hack,这有点牵强。

TL;DR:你的里程可能会有所不同,只是试图获得你所追求的一半:-)

【讨论】:

猜你喜欢
  • 2010-10-21
  • 2016-08-30
  • 2023-04-01
  • 2019-05-03
  • 2015-12-30
  • 2022-10-06
  • 2021-03-15
  • 1970-01-01
相关资源
最近更新 更多