我需要在我的类中使用$GLOBALS['db']
(我的index.php中定义了$db
),但是当我必须调用它时我不想使用$GLOBALS['db']
。
我在课程开头编写了这段代码:
class ClassName
{
var $db;
public function __construct()
{
$this->db = $GLOBALS['db'];
}
public function test()
{
$val = $this->db->oneValue('SELECT first_name FROM users LIMIT 0, 1');
echo $val->first_name;
}
}
但我不喜欢这个;我更喜欢在我的代码中直接使用$db
。是否有解决方案可以通过$GLOBALS['db']
致电$db
?
答案 0 :(得分:8)
简单,只需要在构造函数或setter方法中注入:(我假设$ db是一个对象,而不是连接参数数组等)
class ClassName
{
protected $db;
public function __construct($db)
{
$this->setConnection($db);
//Any other constructor things you want to happen...
}
/*
* This is just here for convenience, this could be protected if you only want to set
* the db connection via the constructor
*/
public function setConnection($db)
{
$this->db = $db;
}
public function test()
{
$val = $this->db->oneValue('SELECT first_name FROM users LIMIT 0, 1');
echo $val->first_name;
}
}
正如上面的一些评论中所提到的,这是一种依赖注入形式,它将使您能够在项目中重复使用代码(A Good Thing TM)。
答案 1 :(得分:0)
我更喜欢对数据库使用单例模式。
这是我用于我的应用程序的数据库类。
class Database {
protected static $_dbh;
const HOST = 'localhost';
const DATABASE = 'dbname';
const USERNAME = 'username';
const PASSWORD = 'password';
private function __construct() { }
public static function getInstance() {
if(!isset($_dbh)) {
try {
#Connection String.
self::$_dbh = new PDO('mysql:host='.self::HOST.';dbname='.self::DATABASE,self::USERNAME,self::PASSWORD);
self::$_dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
#Print Errors.
echo $e->getMessage();
}
}
return self::$_dbh;
}
}
因为我正在使用单例模式,所以将重新使用连接。您现在可以通过调用静态连接方法来使用应用程序中的任何地方连接,即
class ClassName
{
protected static $_dbh;
public function __construct() {
self::$_dbh = Database::getInstance();
}
public function test() {
$sth = self::$_dbh->query('SELECT first_name FROM users LIMIT 0, 1');
$row = $sth->fetchAll(PDO::FETCH_ASSOC);
echo $row['first_name'];
}
}