0

在这段代码中,我尝试扩展 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);
    } 

}
4

1 回答 1

3

在 PHP 中,在这种情况下PDO,对象构造函数通常不返回值。

当您执行以下操作时:

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

如果PDO构造函数 ( parent::__construct()) 没有返回值,则您设置self::$dbnull-value。这就是您收到错误"Call to member function setAttribute()on a non-object"的原因,因为null它不是对象。

要进行测试,您可以尝试以下操作:

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

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

于 2012-11-15T14:14:01.093 回答