12

I have an object with getters and setters but I'm loosing intellisense on that object when I pass it to a function or while iterating through a array of these objects.

For example:

...
$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
   ...
}

What am I missing here?

Do I need to make a change to code(casting.. etc), Missing a phpStorm setting? Maybe it's not possible?

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
}

2番目のケースでは、PHPの型ヒントを追加できます(これをお勧めします)。

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

これにより、そのタイプの値のみを渡すことができるようになります。タイプヒントドキュメントインターフェイスドキュメントも参照してください。

2番目のケースのもう1つの解決策は、関数の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 に答える