<?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
最新评论