2017-03-01 87 views
3

不確定如何問這個問題。但我使用PhpStorm作爲我的IDE。PhpStorm不識別類別中的PDO方法

我創建了一個類來處理我的數據庫檢索和操作。在這裏面我有這樣的連接方法:

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說,它無法找到方法prepareexecute

如果我通過$this->conn到方法和參數使用PHPDoc的塊,它工作正常:

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

我很好奇,爲什麼它不會讓我用$this->conn?雖然沒有更多的代碼將$this->conn傳遞給該方法,但似乎有點多餘。

任何想法,我需要做什麼不同?

+0

鑑於有每個人做常見的錯誤,這樣可以使一個有用的閱讀:[你的第一個數據庫包裝的兒童疾病(https://phpdelusions.net/pdo/common_mistakes)。例如,你處理異常的方式正在破壞這個偉大的功能。 –

回答

8

使用@var屬性的定義之前:

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

這樣,你告訴PhpStorm,下列變量(屬性)是PDO類型。請注意0​​這裏取決於你的代碼,這裏只是一個例子。看看​​瞭解更多關於PHP文檔的意見PhpStorm中的評論。

5

在這裏做正確的事情是聲明$康恩類屬性,並把你的註釋有

myClass { 

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

在我的代碼相同的問題。

這似乎的,這不是你必須在你的源添加的唯一的事情:

<?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日