我有一些问题需要理解。我想开始重写一些旧的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
}
}
还是有其他方法可以做到这一点,我不知道。尝试重新编写我的所有类来合并它似乎很乏味。
答案 0 :(得分:3)
不是在构造函数中创建数据库连接,而是最好使它成为依赖:
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
的内容,使用模拟数据库启用单元测试。
答案 1 :(得分:0)
创建与数据库的连接时,应该在单例类中执行此操作。您只想打开一个与数据库的连接。例如:
public class database
{
static $instance;
public static function getInstance()
{
if($self::$instance == null)
{
$self::$instance = new PDO(); // string value here.
}
return $instance;
}
}
然后,您可以从班级的任何位置调用database::getInstance()
方法,而无需继续重写连接代码。
PS:我知道这个单例不是线程安全的。我只是想把这个概念强调为OP。
答案 2 :(得分:0)
这是我的第一次尝试:
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
}
}
我不完全确定这是否正确,因为我暂时没有办法测试这个。这会被认为是正确的吗?