Почему завершение кода 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. Даже если docblock не верен или параметр не намекает на тип, разве PhpStorm не сможет определить тип объекта на основе переданного аргумента?

Я понимаю, что если я введу подсказку в параметре конструктора или в блоке документа, я получу ожидаемые результаты, но я чувствую, что PhpStorm должен был это выяснить.

Я использую PhpStorm 2018.1.6

Я уверен, что я что-то упускаю из виду и заранее благодарю за помощь.

0

Решение

Причина, по которой PHPStorm не выполняет автозаполнение в этом случае, заключается в том, что, учитывая ваш код и отсутствие подсказок / набранных типов @param в конструкторе может быть несколько Database случаи, когда $this->conn бывает разных типов.

Давайте представим, что вы добавили это в конец вашего примера кода:

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

Теперь, что должно автозаполнение PHPStorm $this->conn (внутри класса) как? Это может быть Database экземпляр или \stdClassили просто что-нибудь еще на самом деле.

Редактировать: Ну, угадайте это технически мог разбирать все вызовы конструктора и рассматривать его как Database|\stdClass|...|otherClasses, но тогда бы тогда тоже нужно было все проверить $this->conn также и назначения (поскольку они могут быть любого типа) … Сомневаюсь, что это того стоит (не говоря уже о времени процессора, которое потребовалось бы при большом количестве кода).

1

Другие решения

Других решений пока нет …