PhpStorm не распознает методы PDO из класса

Не уверен, как именно задать этот вопрос. Но я использую PhpStorm в качестве моей IDE.

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

private function connect() {

        $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->db;
        $options = [
            PDO::ATTR_PERSISTENT => true,
            PDO::ATTR_ERRMODE    => PDO::ERRMODE_EXCEPTION
        ];
        try {
            $this->conn = new PDO($dsn, $this->user, $this->pass, $options);
        } catch(PDOException $e) {
            $this->error = $e->getMessage();
        }

    }

Метод работает нормально, но когда я иду использовать $this->conn в других методах PhpStorm не распознает $this->conn как PDO объект.

Используя этот метод:

private function insert() {
        $insert = $this->conn->prepare($sql);
        $insert->execute();
    }

PhpStorm говорит, что не может найти метод prepare или же execute,

Если я пройду $this->conn в метод и использовать блок PHPDoc для параметра, он работает нормально:

/**
 * @param $conn pdo
 */
private function insert($conn) {
    $insert = $conn->prepare($sql);
    $insert->execute();
}

Мне любопытно, почему это не позволяет мне использовать $this->conn? Хотя это не так много кода для передачи $this->conn к методу, просто кажется немного излишним.

Любые идеи о том, что мне нужно сделать по-другому?

3 ответа

Решение

Использование @var перед определением свойства:

/**
 * @var PDO
 */
private $conn;

Таким образом, вы говорите PhpStorm, что следующая переменная (свойство) имеет тип PDO, Обратите внимание, что private здесь зависит от вашего кода, это здесь только пример. Взгляните на это, чтобы узнать больше о комментариях к документации PHP в PhpStorm.

Правильнее всего здесь объявить свойство класса $conn и поместить туда свою аннотацию

например

myClass {

/**
* @var PDO
*/
private $conn;

Есть та же проблема в моем коде.

Кажется, это не единственное, что вы должны добавить в свой источник:

<?php
  /**
   * Created by PhpStorm.
   * User: zac
   * Date: 26/09/2017
   * Time: 12:52
   */

  namespace POO;

  use \PDO;  // <--- need by PhpStorm to find Methods of PDO

  class PersonnagesManager
  {
    /**
     * @var PDO   <--- need by PhpStorm to find Methods of PDO
     */
    private $_db;

    public function __construct($db) {
      $this->setDb($db);
    }

    public function add(Personnage $perso) {
      $q = $this->_db->prepare('INSERT INTO personnages(nom) VALUES(:nom)');
      $q->bindValue(':nom', $perso->nom());
      $q->execute();
      ....

Так:

use \PDO;

а также

/**
* @var PDO
*/

оба необходимы!

У меня нормально работает на версии 2017.2.4

Другие вопросы по тегам