'PHP技术分享'
;
<?php /** * @author zhuxinlei * @date 2020-06-12 * @desc 我是类A的注释 */ class A { //我是构造函数的注释 public function __construct(B $b) { $this->b = $b; } //我是getB的注释 public function getB() { $this->b->bMethod(); } } class B { public function __construct(C $c,D $d) { $this->c = $c; $this->d = $d; } public function bMethod() { echo "我是B中的方法bMethod()"; } } class C{ public function __construct(){ } public function cMethod(){ echo "我是C中的方法cMethod()"; } } class D{ public function __construct(){ } public function dMethod(){ echo "我是D中的方法dMethod()"; } } class Ioc { protected $instances = []; public function __construct() { } public function getInstance($abstract){ //获取类的反射信息,也就是类的所有信息 $reflector = new ReflectionClass($abstract); // echo $reflector->getDocComment(); 获取类的注释信息 //获取反射类的构造函数信息 $constructor = $reflector->getConstructor(); //获取反射类的构造函数的参数 $dependencies = $constructor->getParameters(); //第一次dependencies为B A的构造函数依赖B 第二次dependencies为 C和D B的构造函数依赖C和D 第三次和第四次dependencies为空,因为C和D构造为空 //第一次调用时p数组中存储的是将要make得到的B,但B依赖C和D,这时p数组中将要make个元素分别是C和D,C和D构造没有依赖,所以make时直接返回C和D的的实例 //接着用p数组中存储的C和D为参数实例出了B,于是p数组中得到了B,p数组中存储的B为参数实例化出了A //第一次时 reflector为A 第二次为B 第三次为C 第四次为D if(!$dependencies){ return new $abstract(); } foreach ($dependencies as $dependency) { if(!is_null($dependency->getClass())){ $p[] = $this->make($dependency->getClass()->name); //这里$p[0]是C的实例化对象,$p[1]是D的实例化对象 } } //创建一个类的新实例,给出的参数将传递到类的构造函数 return $reflector->newInstanceArgs($p); } public function make($abstract) { return $this->getInstance($abstract); } } $ioc = new Ioc(); $a = $ioc->make('A'); $a->getB();
本文为big4ever.com原创文章,转载无需和我联系,但请注明来自www.big4ever.com
微信里点“发现”,扫一下
二维码便可将本文分享至朋友圈。
1. 微信扫一扫打开小程序
2. 微信搜索小程序:今日头彩查询
1. 一分也是爱,爱你多一分
2. 有钱打赏支持,没钱留言转发
用微信小程序发红包的两种方法 小程序红包接口调试 【今日头彩查询】上线啦!!!
白俊遥博客 更多
最新评论