我正在我的命名空间中扩展 PDO 类,并添加一些额外的方法。但是 intelephense 在问题部分显示未定义的方法错误。
这是我的课
namespace MyNameSpace;
class PDOStatement extends \PDOStatement {
public $dbh;
protected function __construct($dbh) {
$this->dbh = $dbh;
}
public function getCol() {
$this->execute();
return $this->fetchAll(PDO::FETCH_COLUMN);
}
}
这是错误信息:
Undefined method 'getCol'
我在包含我的模型之前包含了我的 PDOStatement 扩展类。 (PDOStatement 扩展类在 pdo.php 里面)
include_once(PATH.'/sys/pdo.php');
include(PATH.'/app/models/mymodel.php');
扩展类按预期工作没有问题,但 intelephense 显示我添加到 PDOStatement 类的所有方法的错误。我也在扩展 PDO 类,但它工作正常(intelephense 没有显示我添加到 PDO 类的新方法的任何错误)。我认为这是因为当您调用 pdo->prepare(query) 时 PDOStatement 类是自动创建的,而 intelephense 不理解 PDOStatement 类是扩展的。
这是我的 PDO 扩展课程。
namespace MyNameSpace;
class PDO extends \PDO {
function __construct($dsn, $username="", $password="", $driver_options=array()) {
parent::__construct($dsn,$username,$password, $driver_options);
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('MyNameSpace\PDOStatement', array($this)));
}
}
我通过覆盖 PDO prepare 方法找到了解决方案。实际上 PDO 已经在使用我的新 PDOStatement 但由于它作为选项传递,VSCode 无法理解它。这是为了让 VSCode 了解扩展,并在新的扩展 PDOStatement 类上显示所有方法。
public function prepare(string $query, array $options = []) : PDOStatement|false
{
return parent::prepare($query, $options);
}
注意:这里的PDOStatement指的是MyNameSpace\PDOStatement。