当前位置: 首页 > 后端技术 > PHP

Laravel反射机制

时间:2023-03-29 15:09:49 PHP

一、背景在laravel中,routing和privoder都可以实现自动递归实例化。其实现原理是利用php反射,PHP相关反射文档:参考2.文字表达1.根据classname实例化反射类newReflectionClass($classname);2.获取$classname构造函数(如果$classname有构造函数,则获取构造函数参数,如果没有,直接new$classname获取实例);3、根据构造函数参数,判断是否为类类型,如果是类类型,则继续递归,获取其所属的类类型,如果不是类类型,则使用返回默认值;4.根据构造函数参数,获取依赖项(dependencies),然后$reflect->newInstanceArgs(dependencies),获取$classname的实例;3.模拟laravel代码的实现。在这里,大致模拟了内核,真正的laravel比这段代码复杂得多,功能也多得多foo.phpbar=$bar;$this->baz=$baz;}}F/baz.phpisInstantiable()){thrownew\Exception('无法实例化');}//获取类构造函数$constructor=$reflect->getConstructor();//如果没有构造函数,直接newif(is_null($constructor)){returnnew$class;}//获取$class构造函数中的参数$params=$constructor->getParameters();//获取参数及其依赖$dependencies=$this->getDependenes($params);//从给定的参数创建一个$class类实例return$reflect->newInstanceArgs($dependencies);}公共函数getDependenes($params){$dependenes=[];//循环构造函数中的参数foreach($paramsas$param){//获取参数的类$dependency=$param->getClass();//如果参数不是类类型,则返回默认值if(is_null($dependency)){$dependenes[]=$this->resloveNonClass($param);}else{//如果参数是类类型,递归构建得到参数实例$dependenes[]=$this->build($dependency->name);}}返回$dependenes;}publicfunctionresloveNonClass($param){if($param->isDefaultValueAvailable()){return$param->getDefaultValue();}thrownew\Exception('Nodefaultvalue');//真正的laravel有对应的}}$class='ABC\Foo';$运行=新运行();$object=$run->build($class);变量转储($对象);//object(Foo){object(ABC/Bar),object(ABC/F/Baz)}