如何在将对象传递给函数或迭代时使用phpStorm进行智能感知

Ray*_*ess 12 php intellisense function code-hinting phpstorm

我有一个带有getter和setter的对象,但当我将它传递给函数或迭代这些对象的数组时,我正在丢失对该对象的intellisense.

例如:

...
$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
   ...
}
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

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

hak*_*kre 43

对于第一种foreach情况,它尚未开箱即用,但您通常可以暗示:

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

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

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

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

function doSomething(Person $person) {
   $person->getAge() //  now with code-completition
   ...
}
Run Code Online (Sandbox Code Playgroud)

这也确保您只能传递该类型的值.另请参阅类型提示文档界面文档.

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

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

一些相关的答案:


小智 8

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

/** @var Person $aPerson */
Run Code Online (Sandbox Code Playgroud)

然后

/** @var Person[] $personArray */
Run Code Online (Sandbox Code Playgroud)

这些将在PHPStorm和phpDocumentor中工作.

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