Answers
其实吧,没有大家想象的这么复杂,Zend Framework以把简单的事情搞复杂而著称,其实类中的变量注入过程可以总结为如下过程
class A { private $myObject; public function setMyObject($myObject) { $this->myObject = $myObject; } } $a = new A(); $a->setMyObject(new Object());
一句话说就是将一个外部对象引入作为类的内部属性,只不过我在框架设计时不想绕这么多弯,在java中是通过反射机制探测要注入的对象,所以你得写一堆set方法,因为java是常驻内存的,所以第一次注入时慢一点无所谓,但是如果php也这么搞效率就太低了。所以我反其道而行之,不需要让一个class来声明外部要注入什么变量,只需要知道我要用哪些变量就行了,其具体技巧在于
__get
这个magic method里
class Base { public __get($varName) { $className = ucfirst($varName); $this->{$varName} = new $className; return $this->{$varName}; } }
这样,当我在继承自
Base
的class里随便调用一个不存在的变量,比如
$this->userModel
,它就会通过调用
__get
方法,自动初始化
new UserModel()
,并且将这个变量set到当前类的属性中,第二次调用就不必初始化了。
这只是个具体思路,具体的匹配和初始化规则会更复杂,而且你可能还需要实现单例模式,避免在不同的类中重复初始化相同的对象,不过这些都很简单了,最重要的就是这一步思路,说破了其实也很简单,相信很多朋友早已用过了。