因此,在PHPDoc中,可以在成员变量声明上方指定@var,以提示其类型。然后一个IDE,例如PHPEd,将知道它正在处理的对象类型,并能够为该变量提供代码洞察力。

<?php
  class Test
  {
    /** @var SomeObj */
    private $someObjInstance;
  }
?>

这很好,直到我需要对对象数组做同样的事情,以便在以后迭代这些对象时能够得到适当的提示。

那么,是否有一种方法来声明PHPDoc标签,以指定成员变量是SomeObjs的数组?@var数组是不够的,@var数组(SomeObj)似乎是无效的,例如。


当前回答

问题是@var只能表示一个类型-不包含复杂的公式。如果你有一个语法的“数组的Foo”,为什么停在那里,不添加一个语法的数组的数组,其中包含2个Foo和3个Bar”?我知道元素列表可能比这更通用,但这是一个滑坡。

就我个人而言,我有时会使用@var Foo[]来表示“Foo的数组”,但IDE不支持。

其他回答

Netbeans提示:

在$users[0]->和$this->的User类数组上实现代码完成。

/**
 * @var User[]
 */
var $users = array();

当你完成$this->…,你还可以在类成员列表中看到数组的类型。

Use:

/* @var $objs Test[] */
foreach ($objs as $obj) {
    // Typehinting will occur after typing $obj->
}

在输入内联变量时,和

class A {
    /** @var Test[] */
    private $items;
}

类属性。

2009年PHPDoc(以及像Zend Studio和Netbeans这样的ide)没有这个选项时的先前答案:

你最多只能说,

foreach ($Objs as $Obj)
{
    /* @var $Obj Test */
    // You should be able to get hinting after the preceding line if you type $Obj->
}

我在Zend Studio经常这样做。我不知道其他编辑器的情况,但它应该能起作用。

在NetBeans 7.0(可能更低)中,你可以声明返回类型为“数组与文本对象”,就像@return Text和代码提示一样:

编辑:用@Bob Fanger的建议更新了示例

/**
 * get all Tests
 *
 * @return Test|Array $tests
 */
public function getAllTexts(){
    return array(new Test(), new Test());
}

使用它:

$tests =  $controller->getAllTests();
//$tests->         //codehinting works!
//$tests[0]->      //codehinting works!

foreach($tests as $text){
    //$test->      //codehinting works!
}

这并不完美,但总比“混合”要好,因为“混合”没有任何价值。

缺点是你可以将数组作为文本对象,这会抛出错误。

问题是@var只能表示一个类型-不包含复杂的公式。如果你有一个语法的“数组的Foo”,为什么停在那里,不添加一个语法的数组的数组,其中包含2个Foo和3个Bar”?我知道元素列表可能比这更通用,但这是一个滑坡。

就我个人而言,我有时会使用@var Foo[]来表示“Foo的数组”,但IDE不支持。

在Zend Studio中使用数组[type]。

在Zend Studio中,数组[MyClass]或数组[int]甚至数组[array[MyClass]]都可以很好地工作。