我有一些问题理解这一点。我想开始重写一些旧的MySQL函数代码PDO。它的设置方式是,一个外部文件包含这一行(以及其他内容):
// db.php file
$DB = new dbConnect(SERVER,DB,USER,PASSWORD,3306);
function my_autoloader($class)
{
require_once ($_SERVER['DOCUMENT_ROOT']."/includes/".'class.' . $class . '.php' );
}
spl_autoload_register('my_autoloader');
将创建到我的数据库的连接。这包含在我的页面的顶部,也会加载我所有的类。现在,如果我想使用PDO创建一个新连接,我将执行以下操作:
$conn = new PDO('mysql:host='.SERVER.';dbname='.DB.';charset=utf8',USER, PASSWORD);
但是,我不能在单独的文件上有这行代码,并从类中调用PDO,像下面这样:
require_once 'db.php';
class info
{
protected $ID;
public function __construct($id)
{
$this->ID = $id; //
}
public function getName()
{
$query = "SELECT * FROM job";
$q = $conn->query($query);
$data = $q->fetch(PDO::FETCH_ASSOC);
//do something with $data
}
}
这是否意味着我必须像下面这样通过聚合在构造函数中建立连接?
require_once 'db.php';
class info
{
protected $ID;
protected $pdo;
public function __construct($id)
{
$this->ID = $id; //
$this->pdo = new PDO('mysql:host='.SERVER.';dbname='.DB.';charset=utf8',USER, PASSWORD);
}
public function getName()
{
$query = "SELECT * FROM job";
$q = $this->pdo->query($query);
$data = $q->fetch(PDO::FETCH_ASSOC);
// do something
}
}
或者有另一种我不知道的方法。重新编写所有的类来包含这个似乎很乏味。
与其在构造函数中创建数据库连接,不如让它成为一个依赖项:
public function __construct(PDO $db, $id)
{
$this->pdo = $db;
$this->ID = $id;
}
要使用它,你可以这样做:
// $db = new PDO('mysql:host='.SERVER.';dbname='.DB.';charset=utf8',USER, PASSWORD);
$info = new info($db, '123');
echo $info->getName();
这种方法的主要优点是您不再在类中存储任何配置。此外,您还可以传递任何实现PDO
的内容,从而启用模拟数据库的单元测试。
创建到数据库的连接时,应该在单例类中创建。您只需要打开到数据库的一个连接。例如:
public class database
{
static $instance;
public static function getInstance()
{
if($self::$instance == null)
{
$self::$instance = new PDO(); // string value here.
}
return $instance;
}
}
然后你可以在你的类的任何地方调用database::getInstance()
方法,你不需要一直重写你的连接代码。
这是我的第一次尝试:
class database extends PDO {
protected static $instance;
protected function __construct(){}
public static function getInstance()
{
if(empty(self::$instance))
{
$db_info = array(
"db_host" => SERVER,
"db_port" => PORT,
"db_user" => USER,
"db_pass" => PASSWORD,
"db_name" => DB);
self::$instance = new Database("mysql:host=".$db_info['db_host'].';port='.$db_info['db_port'].';dbname='.$db_info['db_name'], $db_info['db_user'], $db_info['db_pass']);
}
return self::$instance;
}
}
class info
{
protected $ID;
protected $pdo;
public function __construct($id)
{
$this->ID = $id; //
$this->pdo = database::getInstance();
}
public function getName()
{
$query = "SELECT * FROM job";
$q = $this->pdo->query($query);
$data = $q->fetch(PDO::FETCH_ASSOC);
// do something
}
}
我不完全确定这是否正确,因为我目前没有测试这一点的方法。这是正确的吗?