根据这篇文章:
http://www.maltblue.com/tutorial/zend-framework-2-servicemanager
ServiceManager“简而言之就是一个提供对象的简单应用程序注册表”.所以,我认为它应该是一个单例,我们可以在应用程序的任何地方访问.但是在ServiceManager的情况下,它不是.
为什么我不能在应用程序的任何位置获取服务定位器实例?
ServiceManager基本上充当容器.在容器内部,您满足您创建的对象的各种依赖关系,然后将其返回以供其他对象使用.
因此SM以某种方式坐在对象上,而不是进入对象内部.如果您在对象内使用SM实例(可能访问其他服务),那么您将违反控制反转原则.
以下是两种方式
class A { private $data; public function __constructor($sm) { $this->data = $sm->get('user_data'); // Service manager accessed inside the object } }
另一种方式
class B { private $data; public function __constructor($user_data) { $this->data = $user_data; //$user_data getting injected from sm container } }
在Module.PHP里面的某个地方:
'factories'=> array( 'objB'=> function($sm) { //this is the container where sm sites outside the object to satisfy its dependencies $objB = new B($sm->get('user_data')); return $objB; } )
在第二个示例中,依赖项($user_data)被注入到对象中.