我正在尝试创建一个小型CMS以获得乐趣,但我正在接受OOP的一些语义。我有一个基本的数据库类,然后我有一个管理员类。 admin类必须进行数据库查询,所以我一直在做的是让admin类扩展db类,然后通过construct将链接传递给db资源。我的代码看起来像这样:
class admin extends mysql {
function __construct($link) {
$this->link = $link; //$this->link is in the mysql class
}
}
$db = new mysql($host,$user,$pass,$name);
$admin = new admin($db->link);
我知道应该有一个更简单的方法来扩展db类(我假设它是一个全新的实例)。一位朋友告诉我只需将$ db对象传递给admin类并将其存储在那里:
class admin {
var $db;
function __construct($db) {
$this->db = $db;
}
}
$db = new mysql($host,$user,$pass,$name);
$admin = new admin($db);
这是正确的做事方式吗?如果数据库链接已经建立,是否有更简单的方法来引用数据库链接?
答案 0 :(得分:2)
是的,你的朋友是绝对正确的。嗯,他比你原来的方法更正确。
您应该做的是更进一步,创建一个类,其 only job 将查询或更新到数据库并返回结果。该班负责组织查询(全部是prepared statements);你的“admin”类对如何连接或查询数据库一无所知,只知道如何使用这个类,我们称之为“data_layer”。
将data_layer
类的实例传递给构造函数中的admin
类,etvoilà!你已经制作了一个分层程序。恭喜!你迈出了迈向更大世界的第一步。
答案 1 :(得分:0)
我倾向于在admin类中声明并创建数据库类的实例。原因是您的管理类对数据库执行的操作可能与其他数据库访问不能很好地混合;例如,admin类可能会在对应用程序其余部分不方便的时刻启动或提交事务。如果管理员类有自己的连接,那就不会发生。