如何在class :: static var中“安装”类

时间:2014-02-19 04:48:25

标签: php class pdo

我正在尝试在类中安装类,在静态方法

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()

是否可以在静态变量中安装类?感谢您的帮助。

1 个答案:

答案 0 :(得分:-1)

该错误意味着self::$pdo不是对象。这些都是静态变量和方法,但您依靠实例构造函数来设置PDO实例,因此如果有人在调用{{1}之前调用db::run() },该类将无法正常运行。如果你想继续使用全静态类,你需要在调用new db(...)之前在构造函数中完成设置。

我建议您尝试将该类用作实例,但是,如此:

::run

您需要跟踪该类的实例,但这样您就不必担心处于未构造/实例化的状态。

此外,在您的示例中,您正在扩展基础PDO类。扩展内部PHP类通常是一种危险的做法,并且鉴于您正在构建看起来像包装器而不是PDO类的扩展,看起来不像任何理由这样做。