PHP-启动数据库类的最佳位置在哪里?
最近,我从Page类的_构造中取出了Db启动代码,并将其放在启动Page类之后。我从Page类中删除了它,因为我希望能够从任何地方(例如其他类)访问它。它在启动时还需要服务器、用户名、密码和数据库参数,我不希望每次都输入这些参数 现在有没有办法从Page类下访问它?我尝试过几种方法,甚至是全局的(有人告诉我这是一种糟糕的做事方式),但到目前为止都无济于事。我对OO还是新手,但我正在尽可能地自学 我应该让它成为一个静态类吗?这会影响我设置的Db的延迟连接器吗 任何帮助都将不胜感激 多谢各位 [编辑]PHP-启动数据库类的最佳位置在哪里?,php,oop,Php,Oop,最近,我从Page类的_构造中取出了Db启动代码,并将其放在启动Page类之后。我从Page类中删除了它,因为我希望能够从任何地方(例如其他类)访问它。它在启动时还需要服务器、用户名、密码和数据库参数,我不希望每次都输入这些参数 现在有没有办法从Page类下访问它?我尝试过几种方法,甚至是全局的(有人告诉我这是一种糟糕的做事方式),但到目前为止都无济于事。我对OO还是新手,但我正在尽可能地自学 我应该让它成为一个静态类吗?这会影响我设置的Db的延迟连接器吗 任何帮助都将不胜感激 多谢各位 [编辑
类似的问题:全局变量确实有用,这就是其中之一。除非您可能需要多个数据库连接(甚至仍然需要),否则我认为设置全局$db对象没有问题 另一种方法是使用一个静态的“工厂”类来获取对象。在Joomla 1.5中,访问DB对象的方式如下:
$db =& JFactory::getDBO();
getDBO函数检查DB对象是否已创建:如果已创建,则返回对它的引用,否则连接并初始化,然后返回它
这同样适用于其他“可以设置为全局”对象,如当前用户对象。某种全局(可以是全局变量、单例或其他变量)是对您以前方法的改进,因此您走上了正确的道路。但是,一般来说,您应该尽量减少程序状态的范围(出于一些原因,我在这里不作详细介绍)。使用全局变量与此原则相冲突。对于这个问题有不同的解决方案,但最有效且经常被忽视的方法是使用控制反转;您的类应该接收依赖项,而不是获取依赖项。例如,假设您当前拥有此
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编程中相当常见的模式。除了比传递函数参数更实用之外,它还具有将构造(共享依赖项相互连接)与运行时(使用它们)分离的额外好处。这使得很多事情变得简单。创建singleton方法是为了确保任何类只有一个实例。但是,由于人们将其作为一种快捷方式全球化,因此它被称为懒惰和/或糟糕的编程。我将尝试开发类似的东西。我已经见过=&几次了,但我仍然不确定它的含义。它将变量设置为引用。更多信息:我更喜欢在=和&之间的空格,这不会使它看起来像一个新的操作符在=之后出现会使它看起来更混乱(因为它的顺序与+=、-=、*=或/=)不一样是的-我已经和其他程序员就此进行了“讨论”。显然,使用“=&”更正确,但我个人更喜欢“=&”,除非您使用的是php≤ 4、参照分配对象没有意义。我问了一个类似的问题,我在你的类名中看到一个动词(