PhpStorm无法识别类中的PDO方法

时间:2017-03-01 14:56:31

标签: php pdo phpstorm

不确定如何提出这个问题。但我使用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说它找不到方法prepareexecute

如果我将$this->conn传递给方法并在参数上使用PHPDoc块,它可以正常工作:

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

我很好奇它为什么不让我使用$this->conn?虽然将$this->conn传递给方法的代码并不多,但似乎有点多余。

关于我需要做什么不同的任何想法?

3 个答案:

答案 0 :(得分:12)

在属性定义之前使用@var

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

通过这种方式告诉PhpStorm,以下变量(属性)的类型为PDO。请注意,此处private取决于您的代码,这只是一个示例。请查看this以了解有关PhpStorm中的PHP文档注释的更多信息。

答案 1 :(得分:6)

这里要做的正确的事情是声明$ conn类属性并将注释放在那里

例如

myClass {

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

答案 2 :(得分: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版上为我工作正常