注册表设计模式有什么不好吗?

时间:2010-01-20 02:00:57

标签: php class registry

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

对于社交网站(facebook,myspace)。

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

在此之前,我使用的是单例模式,因此我必须为每个页面或其他类中的所有3个MAIN类调用我的单例方法。

所以我只是想知道使用Registry类是否有任何缺陷?我可以看到,似乎可能更难看出哪些类依赖于哪些类等等。除此之外它似乎是一个很好的解决方案,我还看到了另一篇用户注册表类的帖子,他们在注册表中存储设置,可以在注册表Object传入的所有其他类中访问它们,我相信我也会很好地利用这个功能。

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


更新

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

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

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

第二种方法似乎很容易理解对象的来源?

1 个答案:

答案 0 :(得分:-1)

你的意思是Singleton的注册表,对吗?如果是这样,听起来你真正想要的就是到处访问三个全局对象,但包含在另一个对象中。

因此,如果您编写了cache.php,sessions.php和database.php,它们定义了类CacheSessionsDatabase,那么您希望将它们全部包含在内在registry.php中定义的Registry对象。

首先,以这种方式控制实例化的ORDER非常棒。它比简单地执行cache.php,sessions.php和database.php的require_once更好,并且在它们内部不仅定义了类,而且定义了它的单个全局实例。它通过您包含/要求它的方式来控制实例化的ORDER。有点低俗。最好拥有你的Registry对象,当它被创建并成为$registry全局时,首先要做的就是按顺序控制你的全局变量的创建。

其次,拥有一个具有单个$ registry全局的Registry.php非常棒。在各种文件中定义全局变量很难管理。

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

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

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

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

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