它应该用于哪些任务?不是吗?
变量的全局状态不是一个好习惯.
主对象可以通过$front-> setParam(‘paramName’,$object)注入全局状态,
那么Zend_Registry的目的是什么?
When you want to find an object you usually start with another object that has an association to it,and use the association to navigate to it. Thus,if you want to find all the orders for a customer,you start with the customer object and use a method on it to get the orders. However,in some cases you won’t have an appropriate object to start with. You may know the customer’s ID number but not have a reference. In this case you need some kind of lookup method – a finder – but the question remains: How do you get to the finder?
我使用注册表(当我使用它时)的主要原因是因为它创建了一个易于访问的应用程序范围.使用注册表,我不必在全球范围内丢弃对象;只有注册表本身是全球性的.从任何地方查找我扔进注册表的任何内容都很方便,包括模型:
> Zend_Cache,Zend_Translate,重要的应用程序路径等
然而,就像Singletons一样,Registry经常不受欢迎.这是一个article by Brandon Savage with some thought about why not to use the Registry.针对书记官处的主要论点是
>它使单元测试更难
>没有经验的程序员可能会过多地投入其中并且不关心正确的设计
那些投票反对注册管理机构的人通常会提倡使用Dependency Injection,尽管应该注意的是,一旦你得到了它的实例,你也可以注入注册表.但是,您没有Inversion of Control,因为using对象将从Registry中提取它所需的内容.使用注册表作为服务定位器是一种有效的方法.
见article by Martin Fowler about ServiceLocator vs. Dependency Injection.
正如您对问题的评论中指出的那样,Zend_Registry不是一个严格的单身人士.除了使用Zend_Registry :: getInstance()获得的全局实例外,您还可以根据需要实例化多个实例.所以对象可以拥有自己的注册表.但是当以这种方式使用Registry时,它基本上只是一个美化的ArrayObject.
最后注意事项:就像所有设计模式一样,如果适用于您的问题,请使用它.