看 phalcon 的源码,关于 Di :
假设:
$di = new Di();
// set
$di->set('request', function(){
return new Request();
});
// get
$request = $di->get('request');
看了下大概流程:
1 、 set() 创建 Service 对象
2 、 get() 拿到之前创建的 Service 对象,调用 resolve(),里面 call_user_func() 执行匿名函数
3 、 get() 里给组件 setDI($this) 并返回这个组件对象
里面有个很奇怪的地方:
resolve() 里面会用 \Closure::bind() 把 $di 对象交给匿名函数,接着才 call_user_func ,但是 $di->get() 里面却通过 setDI() 来注入 $di 对象,这是何必呢、、、
既然把 $di 对象 bind() 回去了,我就可以在匿名函数里直接 return new Request($this); 啊,这样每个组件继承一个基类,基类的构造函数负责给自己的 protected $_di; 赋值啊、、、
求解!
di: https://github.com/phalcon/cphalcon/blob/master/phalcon/di.zep
service: https://github.com/phalcon/cphalcon/blob/master/phalcon/di/service.zep
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.