在此代码中,我尝试扩展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);
}
}
答案 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
引用设置为当前实例。