我最近注意到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
我确定我会忽略某些东西,并在此先感谢您的帮助。
答案 0 :(得分:1)
在这种情况下,PHPStorm无法自动完成的原因是,由于您的代码以及构造函数中缺少类型提示/类型where {}
,因此可能存在多个@param
实例,其中{{ 1}}的类型不同。
假设您将其添加到示例代码的末尾:
Database
现在,PHPStorm自动完成$this->conn
(在类中)应该是什么?可以是$dummy = new \stdClass;
$databaseTest2 = new DatabaseTest($dummy);
实例,也可以是$this->conn
,也可以是其他任何东西。
编辑:嗯,从技术上讲,它可能可以解析所有构造函数调用并将其视为Database
,但随后它还必须检查所有\stdClass
分配,如下所示:好(因为它可以是任何类型)...值得怀疑(更不用说在有很多代码的情况下要花费的CPU时间)。