2008-12-18 25 views
0

我最近把我的Db启动代码从我的Page类的__construct中取出,并在我启动Page类后放置它。我从Page类中删除它,因为我希望能够从任何地方访问它(例如其他类)。它也会在启动时将服务器,用户名,密码和数据库参数传递给它,而且我不希望每次都输入这些参数。PHP - 哪里是发起数据库课程的最佳地点?

现在有什么办法可以从Page类下访问它吗?我已经尝试了几种方法,甚至是全球性的(我被告知这是一种可怕的方式来做事情),目前为止没有效果。我对面向对象仍然很陌生,但我尽我所能教自己。

我应该让它成为一个静态类吗?这会影响延迟连接器到Db我已安装?

任何帮助将不胜感激。

谢谢

[编辑]

类似的问题:Global or Singleton for database connection?

+0

我问了一个类似的问题[数据库连接的全局或单例?](http://stackoverflow.com/questions/130878/global-or-singleton-for-database-connection) – Imran 2008-12-18 04:41:23

回答

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编程中相当常见的模式。除了传递函数参数更实用外,它还具有从运行时(使用它们的地方)分离构造(共享依赖关系彼此连接)的额外好处。这使得许多事情变得更简单。

0

全局变量确实有使用,而这将是其中之一。除非您可能需要多个数据库连接(甚至还是),否则我不会看到设置全局$ db对象时出现问题。

另一种方法是有一个静态的“工厂”类,您可以使用它来获取对象。在的Joomla 1.5,你的方式访问数据库对象是这样的:

$db =& JFactory::getDBO(); 

的getDBO函数检查DB对象被创建:如果有,则返回对它的引用,否则连接和初始化,以及然后返回它。

这可能同样适用于其他“可能成为全局”的对象,如当前的用户对象。

+0

我会在开发这样的东西。我已经看过=&几次,但我仍然不确定它的含义。 – alex 2008-12-18 04:41:59

+0

它将变量设置为* reference *。这里有更多的信息:http://www.php.net/manual/en/language.references.return.php – nickf 2008-12-18 04:45:44

0

创建单例方法以确保任何类只有一个实例。但是,由于人们将其用作快捷全球化的一种方式,因此被称为懒惰和/或糟糕的编程。

相关问题