我有一些问题需要理解.我想开始重写一些旧的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');
Run Code Online (Sandbox Code Playgroud)
哪个会创建与我的数据库的连接.这包含在我的页面顶部,也会加载我的所有课程.现在,如果我想使用PDO创建新连接,我会执行以下操作:
$conn = new PDO('mysql:host='.SERVER.';dbname='.DB.';charset=utf8',USER, PASSWORD);
Run Code Online (Sandbox Code Playgroud)
但是,我不能在单独的文件上使用这行代码,并在类中调用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
}
}
Run Code Online (Sandbox Code Playgroud)
这是否意味着我必须通过如下所示的聚合在构造函数中建立连接?
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
}
}
Run Code Online (Sandbox Code Playgroud)
还是有其他方法可以做到这一点,我不知道.尝试重新编写我的所有类来合并它似乎很乏味.
与其在构造函数内创建数据库连接,不如将其设为依赖项:
public function __construct(PDO $db, $id)
{
$this->pdo = $db;
$this->ID = $id;
}
Run Code Online (Sandbox Code Playgroud)
要使用它,您需要执行以下操作:
// $db = new PDO('mysql:host='.SERVER.';dbname='.DB.';charset=utf8',USER, PASSWORD);
$info = new info($db, '123');
echo $info->getName();
Run Code Online (Sandbox Code Playgroud)
这种方法的主要优点是您的类中不再存储任何配置。此外,您还可以传递任何实现的内容PDO,从而启用模拟数据库的单元测试。
| 归档时间: |
|
| 查看次数: |
799 次 |
| 最近记录: |