11

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

通常一个数组会这样处理:

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

但我需要这样的东西:

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

这显然不起作用,那么正确的 PHPDoc 表示法是什么?

4

2 回答 2

27

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

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

$doubleNestedArray[0][1]->getFileInfo(); // ->getFileInfo() is suggested by IDE
于 2014-10-21T06:06:38.283 回答
6

首先,了解@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:你的里程可能会有所不同,只是试图获得你所追求的一半:-)

于 2013-12-12T14:58:08.827 回答