我正在寻找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'];
}
}
}
答案 0 :(得分:-1)
您的方法的问题不是全局变量,而是数据库连接永久打开。它并不总是好的。这是一种服务对象,让它全局可见并不是特别糟糕。
如果您不希望全局并希望解决开放连接问题,您可以轻松关闭析构函数中的连接,删除全局变量并在需要时创建/使用/删除数据库。
另一种方法是不使用单例,而是使用所谓的服务类。使DB类不是可实现的,而是定义服务方法(所有静态) - 打开,关闭,执行等等。比DB客户端不应该创建DB对象,而只能访问静态方法。这种方法非常适合现实,因为DB访问被视为一种服务。