我正在尝试在类中安装类,在静态方法
中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()
是否可以在静态变量中安装类?感谢您的帮助。
答案 0 :(得分:-1)
该错误意味着self::$pdo
不是对象。这些都是静态变量和方法,但您依靠实例构造函数来设置PDO实例,因此如果有人在调用{{1}之前调用db::run()
},该类将无法正常运行。如果你想继续使用全静态类,你需要在调用new db(...)
之前在构造函数中完成设置。
我建议您尝试将该类用作实例,但是,如此:
::run
您需要跟踪该类的实例,但这样您就不必担心处于未构造/实例化的状态。
此外,在您的示例中,您正在扩展基础PDO类。扩展内部PHP类通常是一种危险的做法,并且鉴于您正在构建看起来像包装器而不是PDO类的扩展,看起来不像任何理由这样做。