有没有办法让 PhpStorm 的自动完成“更深入”?

Posted

技术标签:

【中文标题】有没有办法让 PhpStorm 的自动完成“更深入”?【英文标题】:Is there a way to make PhpStorm's autocomplete "go deeper"? 【发布时间】:2011-11-29 00:02:04 【问题描述】:

phpStorm 中,如果我创建一个对象,那么我会在该对象上自动完成所有工作正常:

$object = new MyClass();
$object->getNa...

会自动完成到

$object->getName();

到目前为止一切都很好,但是如果我通过第一种方法返回了一个对象,那么自动完成将无法正常工作。

$car->getDriver()->getNam...

将显示一个空列表。 getDriver 方法将其 PHPDoc @return 标记设置为“Driver”,但在其他一些 IDE 中,这可以实现正确的自动完成。

想知道我是否遗漏了某个设置,或者 PhpStorm 是否还没有提供这种高级自动完成功能?

【问题讨论】:

mmh,我的 PHPStorm 确实更深入了。您确定 IDE 知道“更深”的类吗? 不是一个直接的答案,但 PHP IDE 肯定应该这样做。我使用 NetBeans,对于结构良好的项目(类中没有任何会扰乱类扫描器的语法错误),它可以很好地完成嵌套自动完成。 您是否为 getDriver 函数正确设置了“@return 类型”? 是的,@return 类型提示都在那里。这是一个 symfony 项目,它通常不适用于 symfony 类。我对此感到有些困惑,你们所有人似乎都可以正常工作。这是我唯一想完全切换到 PhpStorm 的事情...... 您在示例中切换了上下文。起初,您使用的是$object,它被显式分配了一个MyClass 的实例,但在第二个示例中,您使用的是$car,我们看不到它的初始化。或许这里的问题不是PhpStorm不知道getDriver()的返回值,而是不知道$car的类型。 【参考方案1】:

请确保所有您的项目文件中只存在一个类 Driver 的定义。这对于当前版本的 PhpStorm 至关重要

见http://youtrack.jetbrains.net/issue/WI-2202和http://youtrack.jetbrains.net/issue/WI-2760

【讨论】:

【参考方案2】:

函数getDriver() 需要为返回值(函数的文档块)提供适当的类型提示:

  * @return classOrInterfaceName

这通常足以让 IDE “更深入”。我很确定 Phpstorm 支持这一点,但我不是 Phpstorm 用户。

注意带有接口/类的文件在项目中或被引用。

作为一种变通方法,您可以将返回值分配给一个变量并对该变量进行类型提示。可能不太舒服,但可以提供帮助。

【讨论】:

哎呀,这很奇怪!这是一个 symfony 项目,所以大多数类型提示都在那里,我总是把我的放在我写的类中。在 Netbeans 上,自动完成功能在同一个项目上一直有效...... 好吧,如果项目有依赖注入容器(或隐藏工厂的具体实现),你不能总是有类型提示,因为类型只在运行时才知道。您可能会遇到这种情况,因为 symfony2 使用它的 DI 容器非常灵活。您可能想要手动提示您的变量,请参阅How do I make my PHP IDE understand Dependency Injection Containers?。 是的,知道 DI 上的问题,因为你不知道 ->get('service') 会返回什么,因为它取决于你想要获得的服务。但它发生在我现在没有通过 DI 隐藏的课程上。事实上,使用 Netbeans,在 PhpStorm 没有显示任何内容的情况下,我会显示正确的自动完成功能。这可能是我现在仍在使用的演示版本的限制吗? 我必须承认,我不是 PHPStorm 用户。我会说 PHPStorm 应该 能够像 Netbeans 或 Eclipse 一样做同样的事情,也许您需要设置一些设置或调用方法,然后才能在该深度级别启用此功能。

以上是关于有没有办法让 PhpStorm 的自动完成“更深入”?的主要内容,如果未能解决你的问题,请参考以下文章

IDEA / WebStorm / PhpStorm 添加jQuery自动提示,自动补全,提醒文档

PhpStorm Laravel 5.4 自动外观支持

phpstorm如何从桌面拖入插件

PhpStorm最新版 2017激活办法

PhpStorm最新版 2017激活办法

PhpStorm - 有没有办法将 PHPDoc 转换为类型提示并返回类型声明?