Почему автозавершение кода 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.

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


person Nick Sy    schedule 19.07.2018    source источник
comment
вы должны включить класс в директиву @param. например: @param FeedServlet $servlet, где FeedServlet — это класс параметра $servlet. Таким образом, в вашем случае @param Database $dbc (используя решение для комментариев к документам).   -  person YvesLeBorg    schedule 19.07.2018


Ответы (1)


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

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

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

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

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

person Jeto    schedule 19.07.2018