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



我最近注意到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不会将类型添加到构造函数的自动生成的文档块中,即使它应该能够推导类型。

  2. 即使文档块不正确或参数没有类型提示,PhpStorm不应该能够根据发送的参数来确定对象类型吗?

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

我正在使用PhpStorm 2018.1.6

我肯定我忽略了什么,提前感谢你的帮助。

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

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

$dummy = new stdClass;
$databaseTest2 = new DatabaseTest($dummy);

现在PHPStorm自动完成$this->conn(在类中(应该是什么?它可以是Database实例或stdClass实例,也可以是其他任何实例。

编辑:嗯,从技术上讲,我猜可以解析所有构造函数调用,并将其视为Database|stdClass|...|otherClasses,但随后它还必须检查所有$this->conn赋值(因为它可以是任何类型(。。。怀疑它是否值得(更不用说如果有很多代码的话需要CPU时间(。

最新更新