扩展PDO类时出错

时间:2012-11-15 14:11:14

标签: php

在此代码中,我尝试扩展PDO

class mypdo extends PDO{

    static public $db = null;

    public function __construct($dsn, $username=false, $password=false){
        if(self::$db==null){
            try {            
                self::$db = parent::__construct($dsn, $username, $password);
                self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            } catch (PDOException $e) {
              die("PDO CONNECTION ERROR: " . $e->getMessage() . "<br/>");
            }
        }
        return self::$db;
    }
}

当我打电话

$db = new mypdo(<here my DSN>,<here my user>,<here my password>);

我收到此错误

  

致命错误:在非对象上调用成员函数setAttribute()

错误在这一行

self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

setAttribute()是一个PDO对象的方法,为什么会出现这个错误?

当我将此方法添加到我的PDO类

public function lastInsertId($name) {
    return self::$db->lastInsertId($name); 
}

如果我尝试调用它,我会收到相同的错误消息

我认为正确的代码是

class mypdo extends PDO{

    static public $db = null;

    public function __construct($dsn, $username=false, $password=false){
        if(self::$db==null){
            try {            
                parent::__construct($dsn, $username, $password);
                parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            } catch (PDOException $e) {
              die("PDO CONNECTION ERROR: " . $e->getMessage() . "<br/>");
            }
        }
        return self::$db;
    }

    public function runSQL($SQL) {
        return parent::exec($SQL);
    }

    public function lastInsertId($name) {
       return parent::lastInsertId($name);
    } 

}

1 个答案:

答案 0 :(得分:3)

在PHP中,对象构造函数(在本例中为PDO)的常见做法是不返回值。

当您执行以下操作时:

self::$db = parent::__construct($dsn, $username, $password);

如果PDO构造函数(parent::__construct())未返回值,则表示您将self::$db设置为null - 值。这就是您收到错误“在非对象上调用成员函数setAttribute()的原因,因为null不是对象。

要进行测试,您可以尝试以下方法:

parent::__construct($dsn, $username, $password);
self::$db = $this;

这将调用父的构造函数,然后将self::$db引用设置为当前实例。