12

我有一个带有 getter 和 setter 的对象,但是当我将它传递给函数或迭代这些对象的数组时,我失去了对该对象的智能感知。

例如:

...
$personA = new Person(..);
$age = $personA->getAge();  // intellisense works.

$personArray = array($personA, $personB, .. );
foreach($personArray as $aPerson){
   $aPerson->getAge();   //  no intellisense here
}

doSomething($personA); 



function doSomething($person){
   $person->getAge()         //  no intellisense here
   ...
}

我在这里想念什么?

我是否需要更改代码(转换.. 等),缺少 phpStorm 设置?也许这是不可能的?

4

2 回答 2

44

对于第一种foreach情况,它(还)不可能开箱即用,但是您通常可以暗示:

$personArray = array($personA, $personB, .. );
foreach ($personArray as $aPerson) {
   /* @var $aPerson Person */
   $aPerson->getAge();  // now with code-completition
}

哪个正在对正在进行迭代的变量进行类型提示。或者,您也可以对数组变量进行类型提示:

/* @var $personArray Person[] */
$personArray = array($personA, $personB, .. );
foreach ($personArray as $aPerson) {
    $aPerson->getAge();  // now with code-completition
}

对于第二种情况,您可以添加 PHP 类型提示(我推荐):

function doSomething(Person $person) {
   $person->getAge() //  now with code-completition
   ...
}

这也确保您只能传递该类型的值。另请参阅Type Hinting DocsInterfaces Docs

第二种情况的另一种解决方案是在函数的 docblock 中也记录参数:

/**
 * @param Person $person
 */
function doSomething($person) {
   $person->getAge() //  now with code-completition
   ...
}

一些相关答案:

于 2012-12-27T18:34:58.073 回答
9

虽然来自@hakre答案的 PPHDoc 块在 PHPStorm 中工作,但正确的形式是类型后跟变量名,如下所示

/** @var Person $aPerson */

然后

/** @var Person[] $personArray */

这些将在 PHPStorm 和 phpDocumentor 中工作。

来源:http ://www.phpdoc.org/docs/latest/references/phpdoc/tags/var.html

于 2015-04-24T11:19:47.660 回答