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

时间:2018-07-19 02:18:54

标签: php autocomplete phpstorm code-completion

我最近注意到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);

这里的问题是测试功能中的代码完成无法正常工作

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

  2. 即使docblock不正确或未提示类型的参数,PhpStorm也不应该能够根据发送的参数确定对象类型吗?

我意识到,如果我键入hint的构造函数参数或doc块,我将获得预期的结果,但我觉得PhpStorm应该能够弄清楚这一点。

我正在使用PhpStorm 2018.1.6

我确定我会忽略某些东西,并在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在这种情况下,PHPStorm无法自动完成的原因是,由于您的代码以及构造函数中缺少类型提示/类型where {},因此可能存在多个@param实例,其中{{ 1}}的类型不同。

假设您将其添加到示例代码的末尾:

Database

现在,PHPStorm自动完成$this->conn(在类中)应该是什么?可以是$dummy = new \stdClass; $databaseTest2 = new DatabaseTest($dummy); 实例,也可以是$this->conn,也可以是其他任何东西。

编辑:嗯,从技术上讲,它可能可以解析所有构造函数调用并将其视为Database,但随后它还必须检查所有\stdClass分配,如下所示:好(因为它可以是任何类型)...值得怀疑(更不用说在有很多代码的情况下要花费的CPU时间)。