错误扩展PDO类
在这段代码我尝试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);
}
}
在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
参考当前实例。
你能告诉'self :: $ db = parent :: __构造($ dsn,$ username,$ password)之间的区别;'和你的 –
其有用的+1 .. –
如果我尝试self :: $ db = parent: :__ construct($ dsn,$ username,$ password,array(PDO :: ATTR_ERRMODE => PDO :: ERRMODE_EXCEPTION)); – user1640529
尝试self :: $ db = new PDO($ dsn,$ username,$ password);而不是self :: $ db = parent :: __构造($ dsn,$ username,$ password); – Bgi