multipledependenciesmultipledependencies:不是“死循环”依赖,而是在解析时需要多次解析。例如:C依赖B-》B依赖A-》A依赖...几种方法详解ReflectionParameter::getClass():获取参数类,返回ReflectionClass对象。ReflectionParameter::getName():获取参数名,不仅包括对象类型参数,还包括普通参数参数名的获取。ReflectionClass::getName():获取类名。多依赖解析代码主要使用ReflectionClass、ReflectionMethod和ReflectionParameter添加对常用参数解析的支持,支持默认参数解析/***多依赖解析*/functionmake($abstract,$parameters=[]){if($abstractinstanceof\Closure){return$abstract($parameters);}$resolveParams=resolveParamContext($abstract,$parameters);return(newReflectionClass($abstract))->newInstanceArgs($resolveParams);}functionresolveParamContext($abstract,$parameters=[]){$reflector=newReflectionClass($abstract);}$resolveParams=[];如果($reflectorMethod=$reflector->getMethod("__construct")){$reflectorParameters=$reflectorMethod->getParameters();foreach($reflectorParametersas$parameter){if(array_key_exists($parameter->getName(),$parameters)){if(!empty($parameters[$parameter->getName()])){$resolveParams[]=$参数[$参数->getName()];继续;}elseif($parameter->isDefaultValueAvailable()){$resolveParams[]=$parameter->getDefaultValue();}else{thrownew\Exception("parameter".$parameter->getName()."nonegiven");}}//对象类型多重依赖解析if($class=$parameter->getClass()){$className=$class->getName();$resolveParams[]=(newReflectionClass($className))->newInstanceArgs(resolveParamContext($className,$parameters));}}}return$resolveParams;}/***测试反射多重依赖解析*例如:*解析实例C,C依赖B,B依赖A*/classA{publicfunction__construct(){echo"A\n";}}B类{public$a=null;公共函数__construct(A$a){$this->a=$a;}}C类{public$b=null;公共$c=空;公共$默认=空;公共函数__construct(B$b,$c,$default='def错误'){$this->b=$b;$this->c=$c;$this->default=$default;}}var_dump(make('C',['c'=>'c_param']));Output:Summary1.多重依赖分析,主要靠递归不断分析依赖类所依赖的其他类。2、PHP对反射的支持非常强大。很多依赖注入框架基本都支持类的反射分析。
