我试图在类内安装类,使用静态方法
class db extends PDO
{
private static $error;
private static $sql;
private static $bind;
private static $errorCallbackFunction;
private static $errorMsgFormat;
private static $pdo;
public function __construct($dsn = "mysql:host=localhost;dbname=main;",
$user="root", $passwd="")
{
$options = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
);
try {
self::$pdo = new PDO($dsn, $user, $passwd, $options);
} catch (PDOException $e) {
self::$error = $e->getMessage();
}
}这就是我在私有静态$pdo中安装类的方式,我认为可以这样做,但当我调用
public static function run($sql, $bind="")
{
self::$sql = trim($sql);
self::$bind = self::cleanup($bind);
self::$error = "";
try {
$pdostmt = self::$pdo->prepare(self::$sql);错误消息中有一个错误
调用非对象上的成员函数prepare()
可以在静态变量中安装类吗?谢谢您的帮助。
发布于 2014-02-19 05:13:24
该错误意味着self::$pdo不是一个对象。这些都是静态变量和方法,但是您依赖于实例构造函数来设置PDO实例,因此如果有人在调用db::run()之前调用new db(...),该类将无法正确操作。如果您想继续类是完全静态的,则需要在调用::run之前在构造函数中完成设置。
不过,我建议您尝试使用类作为实例,如下所示:
class DB {
private $error;
private $sql;
private $bind;
private $errorCallbackFunction;
private $errorMsgFormat;
private $pdo;
public function __construct($dsn = "mysql:host=localhost;dbname=main;", $user="root", $passwd=""){
$options = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
);
try {
$this->pdo = new PDO($dsn, $user, $passwd, $options);
} catch (PDOException $e) {
$this->error = $e->getMessage();
}
}
public function run($sql, $bind = ''){
$this->sql = trim($sql);
$this->bind = self::cleanup($bind);
$this->error = "";
try {
if(!isset($this->pdo)){
throw new \RuntimeException('No PDO instance');
}
$pdostmt = $this->pdo->prepare(self::$sql);
...
}
}您需要跟踪该类的实例,但这样您就不必担心处于未构造/实例化状态。
此外,在您的示例中,您正在扩展基本的PDO类。扩展内部PHP类通常是一种危险的做法,而且考虑到您构建的是看起来像包装器而不是PDO类的扩展,所以似乎没有任何理由这样做。
https://stackoverflow.com/questions/21871297
复制相似问题