手写自己的php框架(1)

javascript/jquery

浏览数:112

2020-6-26

一直在用别人的框架,其实我们自己也可以快速搭建一个自己的框架,在搭建之前,我们需求掌握几个好用的开源库,
php-di/php-di IOC容器,doctrine/annotations 有逼格的注解功能,nikic/fast-route 路由功能,nikic/PHP-Parser 超逼格的AOP功能

一个简单的IOC容器

class Container
{
    protected static $_singleton = [];
    
    public function get($class_name)
    {
        if(array_key_exists($class_name, self::$_singleton)){
            return self::$_singleton[$class_name];
        }else{
            return self::$_singleton[$class_name] = $this->make($class_name);
        }
    }

    public function make($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()
 */
class Test{
    /**
     *@RequesMapping(route="index")
     */
    public function index()
    {
        echo 111;
    }
}
//通过反射取得注释
$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的词法分析语法分析也是生成这样的东西。

作者:wuxian