我一直在用别人的框架,但是我们也可以快速搭建自己的框架。在搭建之前,我们需要掌握好几个好用的开源库,php-di/php-diIOC容器,doctrine/annotations引人注目的注解功能,nikic/fast-route路由功能,nikic/PHP-Parser超引人注目的AOP功能一个简单IOC容器类Container{protectedstatic$_singleton=[];publicfunctionget($class_name){if(array_key_exists($class_name,self::$_singleton)){returnself::$_singleton[$class_name];}else{returnself::$_singleton[$class_name]=$this->make($class_name);}}publicfunctionmake($class_name){$reflector=newReflectionClass($class_name);//获取参数类的构造函数$constructor=$reflector->getConstructor();$di_params=[];if($constructor){//循环构造函数的参数,如果是类,会实例化foreach($constructor->getParameters()as$param){$class=$param->getClass();if($class){//如果参数是类,创建实例$di_params[]=isset(self::$_singleton[$class->name])?self::$_singleton[$class->name]:$this->make($class->name);}}}返回$reflector->newInstanceArgs($di_params);}}简单注解函数/***@Controller()*/classTest{/***@RequesMapping(route="index")*/publicfunctionindex(){echo111;}}//通过反射获取注释$c=newReflectionClass(Test::class);$class_doc=$c->getDocComment();//定时产生你想要的内容preg_match('/@Controller\((.*)\)/i',$class_doc,$pre_fix);var_dump($pre_fix[1]??'');$methods=$c->getMethods();foreach($methodsas$method){$method_doc=$method->getDocComment();preg_match('/@RequesMapping\((.*)\)/i',$method_doc,$router);var_dump($router[1]??'');//拼接成路由echo$pre_fix[1].$router[1];路由功能和AOP部分在下一节介绍,特别是AOP。网上很多人说__call是用来做动态代理的。重写ast节点,ast很牛逼,php的词法分析语法分析也生成这样的东西。
