Метод PhpStorm не найден в классе subject

#php #phpstorm

#php #phpstorm

Вопрос:

У меня есть отдельный класс, который устанавливает PDO-соединение:

 class Core {
    public $dbh; // handle of the db connection
    private static $instance;

    private function __construct()  {
        // building data source name from config
        $dsn = 'mysql:host=' . Config::read('db.host') . ';dbname=' . Config::read('db.basename') . ';port=' . Config::read('db.port') .';charset=' . Config::read('db.charset') . ';connect_timeout=15';
        //echo '$dsn is '.$dsn;

        // getting DB user from config
        $user = Config::read('db.user');

        // getting DB password from config
        $password = Config::read('db.password');

        $this->dbh = new PDO($dsn, $user, $password);
        $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $this->dbh->exec("set names utf8mb4");
    }

    public static function getInstance() {
        if (!isset(self::$instance)) {
            $object = __CLASS__;
            self::$instance = new $object;
        }
        return self::$instance;
    }

    /** @method PDO */
    public function getPdo() {
        $core = $this->getInstance();
        $pdo = $core->dbh;
        return $pdo;
    }
}
  

Теперь, каждый раз, когда я читаю из другого класса или записываю в базу данных в другом классе (например, $compared_text = Core::getInstance()->getPdo()->query($query_text)->fetchColumn(); ), хотя все работает, PhpStorm сообщает о методе «Метод, на который ссылается, не найден в классе subject» getPdo() .

Я погуглил и наткнулся на некоторые ответы здесь, в Stackoverflow, в которых предлагалось использовать PhpDocs, и, как вы можете видеть, я добавил комментарий /** @method PDO */ перед функцией getPdo() , но она по-прежнему выдает это предупреждение. В чем проблема?

UPD

Предупреждение исчезнет, если я напишу $compared_text = Core::getInstance()->Core::getPdo()->query($query_text)->fetchColumn(); .

Итак, теперь мой вопрос заключается в следующем:

Могу ли я удалить предупреждение без явной записи Core:: перед вызовом каждого метода из него? Если нет, я просто проигнорирую предупреждение (хотя и не хочу его отключать).

Комментарии:

1. Возможно, аннотировать getInstance() с типом возвращаемого значения.

2. Это сработало, хотите опубликовать это в качестве ответа?

Ответ №1:

Аннотируйте возвращаемый тип getInstance() метода следующим образом

 /**
 * @return Core
 */
public static function getInstance() {
    if (!isset(self::$instance)) {
        $object = __CLASS__;
        self::$instance = new $object;
    }
    return self::$instance;
}
  

IDE прочитает эту аннотацию.

Комментарии:

1. Еще лучше использовать подсказку типа public static function getInstance() : Core {