2017-03-01 89 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日