一直在用别人的框架,其实我们自己也可以快速搭建一个自己的框架,在搭建之前,我们需求掌握几个好用的开源库,php-di/php-di IOC容器,doctrine/annotations 有逼格的注解功能,nikic/fast-route 路由功能,nikic/PHP-Parser 超逼格的AOP功能
一个简单的IOC容器classContainer{ 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 = new ReflectionClass($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); } } }
return $reflector->newInstanceArgs($di_params); } }简单的注解功能/** *@Controller() */classTest{ /** *
@RequesMapping(route="index") */publicfunctionindex(){ echo111; } } //通过反射取得注释 $c =
new ReflectionClass(Test::class); $class_doc = $c->getDocComment(); //正则出自己想要的内容 preg_match(/@Controller\((.*)\)/i
, $class_doc,$pre_fix); var_dump($pre_fix[1]??); $methods = $c->getMethods(); foreach ($methods as $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进行动态代理,这个太没逼格的写法,现在都是用PHP-parser开源库,生成ast抽象语法树,重写ast的节点,ast 这个很有逼格,php的词法分析语法分析也是生成这样的东西。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。