为什么PhpStorm代码完成不能在这么简单的代码块上工作?

为什么PhpStorm代码完成不能在这么简单的代码块上工作?,php,autocomplete,phpstorm,code-completion,Php,Autocomplete,Phpstorm,Code Completion,我最近注意到,PhpStorm中的代码完成效率较低,我不确定我的设置是否混乱,或者我只是缺少了一些东西 下面是我尝试做的一个例子: class Database { public function doStuff() {} } class DatabaseTest { private $conn; /** * DatabaseTest constructor. * @param $dbc */ public function __

我最近注意到,PhpStorm中的代码完成效率较低,我不确定我的设置是否混乱,或者我只是缺少了一些东西

下面是我尝试做的一个例子:

class Database {
    public function doStuff() {}
}

class DatabaseTest {
    private $conn;

    /**
     * DatabaseTest constructor.
     * @param $dbc
     */
    public function __construct($dbc) {
        $this->conn = $dbc;
    }

    public function test() {
        $this->conn->
    }
}
$dbc = new Database();
$databaseTest = new DatabaseTest($dbc);
这里的问题是测试函数中的代码完成将无法正常工作

PhpStorm不会将类型添加到构造函数自动生成的docblock中,即使它应该能够推断类型

即使docblock不正确或参数没有提示类型,PhpStorm是否应该能够根据发送的参数确定对象类型

我意识到,如果我键入hint构造函数参数或doc块,我将得到预期的结果,但我觉得PhpStorm应该能够找到这个结果

我正在使用PhpStorm 2018.1.6


我确信我忽略了一些东西,并提前感谢您的帮助。

在这种情况下,PHPStorm不能自动完成的原因是,考虑到您的代码以及构造函数中没有类型提示/typed@param,可能有几个数据库实例中$this->conn的类型不同

让我们假设您在示例代码的末尾添加了以下内容:

$dummy = new \stdClass;
$databaseTest2 = new DatabaseTest($dummy);
现在PHPStorm应该在类as中自动完成$this->conn什么?它可以是一个数据库实例或\stdClass,也可以是其他任何类型


< P>编辑:好的,从技术上讲,它可以解析所有构造函数调用,并将其视为数据库“sdBaseType……其他类”,但之后它还必须检查所有$THE-CONN赋值,因为它可以是任何类型的…如果代码太多,那么不提CPU时间就值得了。

您应该在@param指令中包含该类。比如:@param FeedServlet$servlet,其中FeedServlet是参数$servlet的类。因此,在您的案例中,@param Database$dbc使用文档注释解决方案。