2012-11-15 116 views
0

在这段代码我尝试extendo PDO错误扩展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>); 

我得到这个错误

Fatal error: Call to a member function setAttribute() on a non-object

的错误是在这一行

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); 
    } 

} 
+0

尝试self :: $ db = new PDO($ dsn,$ username,$ password);而不是self :: $ db = parent :: __构造($ dsn,$ username,$ password); – Bgi

回答

3

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

当你做以下几点:

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

如果PDO构造(parent::__construct())没有返回值,你设置self::$dbnull - 值。这就是为什么你收到错误“调用成员函数setAttribute()对非对象”,因为null不是一个对象。

为了测试,你可以尝试以下方法:

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

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

+0

你能告诉'self :: $ db = parent :: __构造($ dsn,$ username,$ password)之间的区别;'和你的 –

+0

其有用的+1 .. –

+0

如果我尝试self :: $ db = parent: :__ construct($ dsn,$ username,$ password,array(PDO :: ATTR_ERRMODE => PDO :: ERRMODE_EXCEPTION)); – user1640529