Недавно я заметил, что завершение кода было менее эффективным в 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 не верен или параметр не намекает на тип, разве PhpStorm не сможет определить тип объекта на основе переданного аргумента?
Я понимаю, что если я введу подсказку в параметре конструктора или в блоке документа, я получу ожидаемые результаты, но я чувствую, что 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
также и назначения (поскольку они могут быть любого типа) … Сомневаюсь, что это того стоит (не говоря уже о времени процессора, которое потребовалось бы при большом количестве кода).
Других решений пока нет …