首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在类中“安装”类::static

如何在类中“安装”类::static
EN

Stack Overflow用户
提问于 2014-02-19 04:48:24
回答 1查看 48关注 0票数 0

我试图在类内安装类,使用静态方法

代码语言:javascript
复制
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中安装类的方式,我认为可以这样做,但当我调用

代码语言:javascript
复制
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()

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-19 05:13:24

该错误意味着self::$pdo不是一个对象。这些都是静态变量和方法,但是您依赖于实例构造函数来设置PDO实例,因此如果有人在调用db::run()之前调用new db(...),该类将无法正确操作。如果您想继续类是完全静态的,则需要在调用::run之前在构造函数中完成设置。

不过,我建议您尝试使用类作为实例,如下所示:

代码语言:javascript
复制
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类的扩展,所以似乎没有任何理由这样做。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21871297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档