我有一个带有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
...
}
我在这里缺少什么?
我是否需要更改代码(转换等),缺少phpStorm设置? 也许这不可能?
答案 0 :(得分:41)
对于第一个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 Docs和Interfaces Docs。
第二种情况的另一种解决方案是记录函数docblock中的参数:
/**
* @param Person $person
*/
function doSomething($person) {
$person->getAge() // now with code-completition
...
}
一些相关答案:
答案 1 :(得分:8)
虽然来自Google's NDK bug tracker的PPHDoc块在PHPStorm中有效,但正确的形式是类型,后跟变量名称,如下所示
/** @var Person $aPerson */
那个
/** @var Person[] $personArray */
这些将在PHPStorm和phpDocumentor中有效。
来源:@hakre