我最近从我的Page类的__construct中取出了我的Db启动代码,并在我启动Page类之后放置它。我从Page类中删除了它,因为我希望能够从任何地方(例如其他类)访问它。启动时它还需要服务器,用户名,密码和数据库参数,我不希望每次都输入这些参数。
我现在可以从Page类下访问它了吗?我尝试了一些方法,甚至是全局方法(我被告知这是一种糟糕的做法),到目前为止无济于事。我仍然是OO的新手,但我尽我所能地教自己。
我应该把它变成静态类吗?这会影响我设置的Db的延迟连接器吗?
非常感谢任何帮助。
谢谢
[编辑]
答案 0 :(得分:2)
某种全球性(全球变量,单身或其他变体)是对您之前方法的改进,因此您处于正确的轨道上。一般来说,你应该尽量减少程序状态的范围(由于一些原因,我不会在这里讨论)。拥有全局变量与此原则相冲突。这个问题有不同的解决方案,但最强大且经常被忽视的方法是使用控制反转;你的班级应该接收它而不是获得依赖。例如,假设您目前有此
class EditUserController {
function saveUser() {
$db = Database::GetInstance();
$db->execute("update users set ...", ...);
}
}
您可以将其更改为:
class EditUserController {
function saveUser($db) {
$db->execute("update users set ...", ...);
}
}
在函数参数级别传递依赖关系可能有点笨拙,因此妥协可能是在每个对象级别上传递它:
class EditUserController {
protected $db;
function __construct($db) {
$this->db = $db;
}
function saveUser() {
$this->db->execute("update users set ...", ...);
}
}
这是OO编程中相当常见的模式。除了比传递函数参数更实用之外,它还具有从运行时(使用它们的地方)分离构造(其中共享依赖关系相互连接)的额外好处。这使得很多事情变得更简单。
答案 1 :(得分:0)
全局变量确实有用,这就是其中之一。除非您可能需要多个数据库连接(甚至是静止的),否则我没有看到设置全局$ db对象的问题。
另一种方法是使用静态“Factory”类来获取对象。在Joomla 1.5中,访问数据库对象的方式如下:
$db =& JFactory::getDBO();
getDBO函数检查是否已创建DB对象:如果已创建,则返回对它的引用,否则连接并初始化,然后返回它。
这同样适用于其他“可以制作的全局”对象,例如当前的User对象。
答案 2 :(得分:0)
创建单例方法是为了确保只有一个类的实例。但是,因为人们将它用作快捷全球化的一种方式,所以它被称为懒惰和/或糟糕的编程。