【发布时间】:2011-04-18 17:15:33
【问题描述】:
我有一个数据库类,用于进行选择、更新、删除MySQL 查询。
现在,我想在另一个类中创建一个 MySQL 查询,但是如果我在 index.php 中定义 $db = new DB();,我不能在另一个类中使用 $db var。如果我想进行查询,是否必须一遍又一遍地定义变量$db?或者有没有办法让$db var 带有一个对象全局变量?
【问题讨论】:
我有一个数据库类,用于进行选择、更新、删除MySQL 查询。
现在,我想在另一个类中创建一个 MySQL 查询,但是如果我在 index.php 中定义 $db = new DB();,我不能在另一个类中使用 $db var。如果我想进行查询,是否必须一遍又一遍地定义变量$db?或者有没有办法让$db var 带有一个对象全局变量?
【问题讨论】:
最干净的方法是aggregate injecting 它需要的数据库类。所有其他方法,例如使用global 关键字或使用static 方法,更不用说单例了,都在您的类和全局范围之间引入了紧密耦合,这使得应用程序更难测试和维护。做吧
// index.php
$db = new DBClass; // create your DB instance
$foo = new SomeClassUsingDb($db); // inject to using class
和
class SomeClassUsingDb
{
protected $db;
public function __construct($db)
{
$this->db = $db;
}
}
如果需要依赖项为实例创建有效状态,请使用Constructor Injection。如果依赖项是可选的或需要在运行时可互换,请使用 Setter Injection,例如
class SomeClassUsingDb
{
protected $db;
public function setDb($db)
{
$this->db = $db;
}
}
【讨论】:
您可能想要singleton。这为您提供了一种在代码中的任何位置获取 DB 实例的方法。然后在任何你想查询的地方,先查询$db = DB::getInstance();。
另一种方法是dependency injection,它将一个数据库实例传递给所有需要的类。
【讨论】:
使用魔法函数__autoload()。
【讨论】:
首先将您的数据库类设为singleton。然后在您的新课程中,您可以执行以下操作:
class myNewClass{
private $_db;
public function __construct(){
$this->_db = DB::getInstance();
}
}
【讨论】:
在一个类上定义它(单独的PHP 文件)。然后在需要 var 的每个 PHP 文件中都需要它。
【讨论】:
在您的index.php 文件中使用
require_once('path_to_file_with_class.php');
你也可以使用include_once,如果'path_to_file_with_class.php'文件不可用,它会给你一个警告而不是一个错误。
【讨论】:
您可以在 index.php 文件中将其定义为全局,并在类构造函数中也放入 $this->db &= $GLOBALS['db'];
【讨论】: