不确定如何提出这个问题。但我使用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
传递给方法的代码并不多,但似乎有点多余。
关于我需要做什么不同的任何想法?
答案 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版上为我工作正常