参考资料:Laravel底层核心概念核心代码分析详解PHP控制反转(IOC)和依赖注入(DI)闭包匿名函数,还是傻笨的不懂?Laravel框架的核心优势是集成了Composer实现依赖注入,更好的管理类依赖,扩展方便(相对于MVC模式)。高级特性:console控制台、event事件、queue队列、middleware中间件、facade模式门面核心概念:服务容器serviceProvider劣势及优化劣势加载文件过多,访问速度慢优化缓存配置文件去除不必要的加载文件(主要是serviceProvider)打开Opcache框架启动流程(生命周期)参考自动加载文件生成服务容器1)注册基本bingings2)通过bind注册服务容器、事件、路由、日志服务3)通过bind接口获取Request对象逻辑处理1)分析启动项(基础服务)如路由和异常处理,门面,服务容器2)通过管道模式,使用中间件过滤用户请求,处理业务逻辑并返回Response对象知识点单例模式,观察者模式,管道模式依赖注入,匿名函数,反射预定义接口ArrayAccess控件inversionInversionofcontrolanddependencyinjectionIOC(inversionofcontrol)将组件间的依赖关系从程序内部管理到外部来管理解释:不是直接在类A中创建类B的新实例,而是类的实例classB通过IOC容器A传递给classDependencyinjectionDI(依赖注入)将组件依赖作为参数或者其他形式从外部注入例如:classDbMysql{publicfunctionquery(){}}classIOC{public$db;公共函数__construct($dbMysql){$this->db=$dbMysql;}publicfunctionaction(){$this->db->query();}}$db=newDbMysql();$c=newIOC($db);$c->action();IOC类不需要实例化DbMysql,但是传入的是DbMysql的实例作为参数,调用的只是DbMysql的方法。这种模式就是依赖注入。将B类的实例化动作放到IOC类之外,称为控制反转。PHP的反射机制扩展了分析程序,可以在PHP运行时导出或提出类、方法、属性、参数的详细信息。这种动态获取和调用信息的功能称为反射API。classA{publicfunction__construct(B$b){}}classB{}//获取类的反射信息(所有信息)$reflector=newReflectionClass('A');//获取构造函数$constructor=$reflector->getConstructor();//获取构造函数参数$dependencies=$constructor->getParameters();//获取依赖类名foreach($dependenciesas$dependency){if(!is_null($dependency->getClass())){$classname=$dependency->getClass()->name;$p[]=new$classname();}}//根据给定的参数创建一个新的类实例$a=$reflector->newInstanceArgs($p);如果B类也有依赖类,需要递归创建b=$b;}公共函数getB(){$this->b->bMethod();}}B类{公共函数__construct(C$c,D$d){$this->c=$c;$this->d=$d;}publicfunctionbMethod(){echo"我是B中的方法bMethod()";}}classC{publicfunction__construct(){}publicfunctioncMethod(){echo"我是C中的方法cMethod()";}}classD{publicfunction__construct(){}publicfunctiondMethod(){echo"我是D中的方法dMethod()";}}classIoc{protected$instances=[];publicfunction__construct(){}publicfunctiongetInstance($classname){$reflector=newReflectionClass($classname);$constructor=$reflector->getConstructor();$dependencies=$constructor->getParameters();if(!$dependencies){返回新的$classname();}foreach($dependenciesas$dependency){if(!is_null($dependency->getClass())){$instances[]=$this->make($dependency->getClass()->name);}}返回$reflector->newInstanceArgs($instances);}publicfunctionmake($classname){return$this->getInstance($classname);}}$ioc=newIoc();$a=$ioc->make('A');$a->getB();总结PHP程序运行的本质:include文件,获取实例化对象传统框架:通过include/require管理类依赖。Laravel:通过namespace和use,实现自动加载机制,类所在的文件,然后通过反射获取类的实例化对象。学习资料:laravel底层核心代码解析之匿名函数闭包匿名函数,还一头雾水?匿名函数回调函数调用一个函数时,将另一个函数作为参数传递给被调用函数,而不是传递一个普通变量作为参数使用回调函数将自定义函数传递给函数使用函数测试($v){return$v*$v;}$a=array(1,2,3);print_r(array_map("test",$a));//[1,4,9]匿名函数没有名字的函数就是匿名函数1.普通使用$func=function($str){echo$str;};$func('Hello');2.使用use传递外部变量$b="World";$func=function($str)use($b){echo$str.”“。$b;};$func("你好");闭包(closures)PHP闭包(Closure)也是匿名函数。它是在PHP5.3中引入的。闭包函数是一个可以读取其他函数内部变量的函数闭包=匿名函数+usefunctiongetMoney($a,$b){returnfunction($p)use($a,$b){echo$p.'-'。$一个。'-'。$b;};}$closure=getMoney('1','2');var_dump($closureinstanceofClosure);//true$closure('test');//test-1-2实际应用1.作为回调函数src/Illuminate/Routing/Router.php公共函数gatherRouteMiddleware(Route$route){$middleware=collect($route->gatherMiddleware())->map(function($name){return(array)MiddlewareNameResolver::resolve($name,$this->middleware,$this->middlewareGroups);})->flatten();返回$this->sortMiddleware($middleware);}2。作为闭包src/Illuminate/Container/Container.php//CreateprotectedfunctiongetClosure($abstract,$concrete){returnfunction($container,$parameters=[])use($abstract,$concrete){if($abstract==$concrete){return$container->build($concrete);}返回$container->make($concrete,$parameters);};}//绑定函数bind($abstract,$concrete=null,$shared=false){...if(!$concreteinstanceofClosure){$concrete=$this->getClosure($abstract,$concrete);}...}//调用publicfunctionbuild($concrete){if($concreteinstanceofClosure){return$concrete($this,$this->getLastParameterOverride());}...}注意事项1.匿名函数只有在被调用时才会解析2.调用匿名函数时需要在函数后传递参数
