希望你能帮助我解决这个问题:我有两个类:数据库和用户。数据库使用PDO(在构造函数内)连接到数据库,并具有更改表,插入数据等的功能.Users类将处理登录,以及添加/删除用户。但是,Users类需要连接到数据库。我怎样才能做到这一点?
答案 0 :(得分:10)
你可以做几件事:
$db = new Database();
class Users
{
public function foo()
{
global $db;
$db->query();
}
}
$db = new Database();
class Model
{
static public $db;
}
Model::$db = $db;
class Users extends Model
{
public function foo()
{
self::$db->query();
}
}
class Database
{
private static $instance;
private function __construct()
{
}
public static function instance()
{
return self::$instance ? self::$instance : self::$instance = new self();
}
}
class Users
{
public function foo()
{
Database::instance()->query();
// or $db = Database::instance(); $db->query();
}
}
您要避免的一件事是为每个模型或类创建一个新的数据库连接。
答案 1 :(得分:1)
只需将对数据库类实例的引用添加到Users:
class Users {
var $database;
function __construct() {
$this->database = new Database();
}
};
或者,如果Database是单例,只需直接引用它。
答案 2 :(得分:1)
与通常情况相同,但可能有助于使数据库成为类属性:
<?php
class Users
{
protected $_db;
public function __construct(Database $database = null)
{
if (!$database) {
$database = new Database;
}
$this->_db = $database;
}
public function addUser($username)
{
// Do stuff ...
$this->_db->insert($data);
}
}
然后您可以使用User类,如:
<?php
$users = new Users;
$users->addUser('joebob');
答案 3 :(得分:1)
这样做的一种方法是创建数据库类的ONE共享实例,然后在需要的地方将其用作全局变量。
首先在项目的任何位置创建实例,只需确保它位于全局空间(不在另一个类或函数内)。
$DB = new Database();
然后要访问共享数据库对象,只需使用$ GLOBALS内置数组:
class User {
function __construct() {
$DB = &$GLOBALS['DB'];
// do something
$DB->callSomeMethod();
}
...
}
正如@Ryan所指出的,使用此策略可以实现名称空间冲突。最好的中间路径是将Database类转换为单例。然后它将存储自己的实例(翻译:无论什么连接),可以通过Database :: getInstance()方法访问。
答案 4 :(得分:0)
这是我的用户类:
class Users {
private $data;
private $db;
public function __construct() {
$db = Database::getInstance('localhost', 'database', 'root', '123456');
}
public function __get($key) {
return $this->data[$key];
}
public function __set($key, $value) {
$this->data[$key] = $value;
}
public function test() {
foreach($this->db->query('table', '*', '', '', '', '', '0,5') as $value) {
$results .= $value['field1'] . "<br />";
}
return $results;
}
}