PHP中的函数可以没有名称,没有名称的函数叫做( )函数(手写自己的php框架(1))PHP函数 / PHP函数与容器的集成...

wufei123 发布于 2024-05-18 阅读(9)

一直在用别人的框架,其实我们自己也可以快速搭建一个自己的框架,在搭建之前,我们需求掌握几个好用的开源库,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的词法分析语法分析也是生成这样的东西。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

大众 新闻32128