2010-01-20 55 views
4

注册表设计模式在PHP中是一个很好的解决方案吗?注册表设计模式有什么不好吗?

对于社交网站(脸书,myspace)。

比方说,我有一个数据库类创建一个单一的数据库连接,让我做数据库的东西和一个会议类,它可以让我处理会议以及缓存类,让我缓存项目和检索他们。这是我需要在我的网站的每个页面上访问的3个主要类。在回顾过去一小时的注册表模式之后,我认为它可能是完美的解决方案。我可以将数据库,会话和缓存对象存储到注册表对象中,然后将注册表对象注入到每个页面或每个其他类中,并可以访问我的数据库,会话和缓存。

在此之前,我使用的是单例模式,所以我将不得不为每个页面或其他类中的所有3个主类调用单例方法。

所以我只是想知道是否有使用注册表类的任何垮台? 1,我可以看到,看起来可能很难看出哪些类取决于哪些其他类和类。除此之外,它似乎是一个很好的解决方案,我还看到另一篇文章在用户的注册表类中,他们在注册表中存储设置,在注册表对象传入的所有其他类中访问它们,我相信我会很好地发现这个功能。

所以这里唯一的问题是我错过了什么,或者我只是热的乐透?


UPDATE

此外,如果使用注册表来存储对象,我应该做这样的事情...

$this->session = $registry->getObject('session'); 

或这个代替

$this->registry->session = $registry->getObject('session'); 

第二种方法似乎可能是简单的低估以及对象来自哪里?

回答

-1

您的意思是Singleton s的注册表,对不对?如果是这样,这听起来像你真正想要的是访问全球三个全局对象,但包含在另一个对象内。

所以,如果你写cache.php,sessions.php和database.php中,它定义了类CacheSessionsDatabase,要包含所有这些在registry.php定义的Registry对象内。

首先,用这种方法控制实例化的ORDER是很好的。它比简单地做一个cache.php,sessions.php和database.php的require_once要好,并且在它们中你不仅定义了类,还定义了它的单个全局实例。通过包含/需要它来控制实例化的ORDER。有点低级。更好的办法是让你的注册表对象,当它被创建并成为一个全局的时候,首先就是控制你的全局变量的顺序和想要的创建。

其次,拥有一个Registry.php拥有一个$注册表全局是非常好的。在各种文件中定义全局变量很难管理。

既然我已经同意你的意见,我向你提出一个重要的问题。你怎么看这些是不同的:

$registry->getObject('session'); 
$registry->getObject('database'); 
$registry->getObject('cache'); 

与:

$registry->getSession(); 
$registry->getDatabase(); 
$registry->getCache(); 

个人而言,我喜欢后者。您没有使用字符串“session”来引用通过超类型getObject获得的Session对象。相反,您正在使用getSession()来获得会话。它读得更好。

毕竟,你的注册表知道所有关于这三个全局变量的信息,它明确地创建它们,所以它已经被锁定到一个单一的目的。添加具体方法也与其单一目的并不“弱”或“不好”。相反,我认为这是更少的代码,更容易在眼球上。

+0

很好的建议,我喜欢$ registry-> getSession();方法我只是有另一种方式,使其更加动态和能够设置和反对注册 – JasonDavis 2010-01-20 03:26:46