OOP PDO类中的全局变量

时间:2014-06-05 06:31:37

标签: php oop pdo

我正在寻找oop来增强我的网络开发知识。目前我遇到了一些问题。我创建了一个包含所有查询等的数据库类(获取,计数等)这只允许查询或更新在其他类中占用更少的空间等。我遇到的问题是将此类传递给使其全球可访问。我用过

global $db;

在类函数中,但我读到使用它是不好的做法。我也不想将$ db变量作为参数传递,如果我这样做,我将不得不改变我当前的很多类,如果我能在全球范围内提供$ db,那么它会更容易#34;好&# 34;练习方式。

我可以提供我的Database类,如果有必要,它只是一个带有变量的简单类,它通过构造启动连接。

(第二个问题)

我还在阅读关于单例实例函数的内容,在实现之前我读到它也被认为是不好的做法。有什么东西应该取而代之吗?

(我决定将课程放在下面)

class Database {
    private $host      = 'localhost';
    private $user      = 'xxx';
    private $pass      = 'xxxx';
    private $dbname    = 'xxxxx';

    private $dbh;
    private $error;

    public function __construct(){
        // Set DSN
        $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
        // Set options
        $options = array(
            PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING, 
            PDO::ATTR_EMULATE_PREPARES => false
        );
        // Create PDO Instance
        $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
    }

    public function fetch($sql, $param = "") {
        $this->stmt = $this->dbh->prepare($sql);

        if (empty($param)) {
            $this->stmt->execute();
        } else {
            $this->stmt->execute($param);
        }

        return $this->stmt->fetch();
    }
}

$db = new Database();

我试图完成的一个例子如下 (用户档案页面)

class User {
    function set_user($input) {
        if (is_numeric($input)) {
            $this->user = $input;
        } else {
            $user = $db->fetch("SELECT userid FROM users WHERE url=:url", array(':url' => $input));
            $this->user = $user['userid'];
        }
     }
}

1 个答案:

答案 0 :(得分:-1)

您的方法的问题不是全局变量,而是数据库连接永久打开。它并不总是好的。这是一种服务对象,让它全局可见并不是特别糟糕。

如果您不希望全局并希望解决开放连接问题,您可以轻松关闭析构函数中的连接,删除全局变量并在需要时创建/使用/删除数据库。

另一种方法是不使用单例,而是使用所谓的服务类。使DB类不是可实现的,而是定义服务方法(所有静态) - 打开,关闭,执行等等。比DB客户端不应该创建DB对象,而只能访问静态方法。这种方法非常适合现实,因为DB访问被视为一种服务。