一直在用别人的框架,其实我们自己也可以快速搭建一个自己的框架,在搭建之前,我们需求掌握几个好用的开源库,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];
}