我不确定这是否完全是错误的,所以我正在寻找一些建议。
我已经建立了一个数据库类,构造函数建立了与MySQL数据库的PDO连接。
我一直在关注singletons和全局变量,但似乎总有人建议反对/或。
我正在尝试扩展数据库类的用户类,因此我可以调用PDO函数/方法,但维护单独的用户类代码。这是一件愚蠢的事吗?
答案 0 :(得分:3)
您通常应该将连接传递给您的用户,因此您的用户类会将数据库类型对象放入其构造函数中,然后使用该数据库对象对数据库执行查询。这样,您的数据访问逻辑就会与业务逻辑分开。这就是所谓的构图,而不是你所说的,这是一种内涵。
如果你真的想成为技术人员,那么最好让用户对象只有公共变量,然后你就可以使用'服务'来实现业务逻辑。
class UserService implements IUserService
{
private $_db;
function __construct(IDb $db) {
$this->_db = db;
}
function GetAllUsers() {
$users = Array();
$result = $this->_db->Query("select * from user")
foreach($result as $user) {
//Would resolve this into your user domain object here
users[] = $user;
}
return users;
}
}
答案 1 :(得分:3)
好吧,问问自己User
是否是Database
的特例。我不确定别人怎么看待它,但我会有点生气。我认为你需要的是阅读Liskov substitution principle。
至于解决你的“人们告诉我全局错误”问题,这里有两个你应该看的视频:
答案 2 :(得分:2)
OOP中类扩展背后的想法是将子类与父类相关联。例如,学校可能有一个Person类,其中包括Faculty and Students的扩展类。两个子类都是人,因此扩展Person类是有意义的。但是用户不是一种数据库,所以如果你把它作为扩展,有些人可能会感到不安。
就个人而言,我会将数据库对象作为参数发送到构造函数中的User类,并简单地将该对象分配给类属性。例如:
class User
{
protected $db;
function __construct($username, $password, $db)
{
//some code...
$this->db = $db;
}
}
或者,尽管有些人可能会因此而对你大喊大叫,但您可以使用global关键字继承全局范围内的变量,以便在方法中使用。缺点是你必须在需要它的每种方法中声明它是全局的,或者你可以这样做:
class User
{
protected $db;
function __construct($username, $password)
{
global $db;
//some code...
$this->db = $db;
}
}
但是在回答你的问题时,不,我认为你不应该将User作为数据库的扩展;即使它可以满足你的需要,也不是一个合适的OOP练习。
答案 3 :(得分:0)
根据对象的定义,它非常简单。它是数据的封装和对数据执行的操作,因此如果我们只考虑理论观点,它将引导我们在愉快的环境中。
我的建议是创建一个抽象的数据访问类,使用广义的基本crud操作和使用PDO,ADO或其他一些数据库抽象库的简单查询执行。现在将此类用作大多数模型类(如User。
)的父级现在,基本的CRUD由抽象数据访问类提供,您可以编写特定于用户对象的行为,例如通过使用抽象父类的简单查询接口来获取用户的所有帖子。 / p>
这种方法在耦合功能和更高的可读性和重用能力方面将带来更多的模块化。
答案 4 :(得分:-5)
我认为具体案件没有任何问题。您可以将它用于将某个用户的DB凭据包装在对象中这样简单的事情,这样他们就不必在使用DB对象的任何地方指定它们。
$db = new UserDB();
会比
好一些$db = new StandarDB($username, $password, $default_db);