Laravel 依赖注入深入了解

最近在学习 java 。 看java 入门到精通 。在反射部分 突然对以前不懂的 依赖注入 豁然开朗

依赖注入 就是通过反射 去获取对象中需要的参数 类

下面是模仿laravel 实现过程 。比较 low

原创 转载请注明出处

register = array_merge($this->register , $bind) ;
    }
}
 
 
 
namespace cpp;
use app\interfaces\RequestInterface;
use app\interfaces\SendSmsInterface;
 
/**
 * 控制器
 */
class UserController
{
    public function __construct()
    {
    }
 
    public function test(RequestInterface $request , SendSmsInterface $sendSmsService){
        var_dump($request->id);
        var_dump("this is 依赖注入");
        var_dump($sendSmsService->name);
    }
}
 
namespace test;
 
use bpp\Container;
 
//实例化容器
$api = new Container();
//将依赖注册到容器
$api->register([
    \app\interfaces\RequestInterface::class => \app\Request::class
]);
$api->register([
    \app\interfaces\SendSmsInterface::class => \app\SendSmsService::class
]);
 
// 模仿路由
$router = "cpp\UserController@test";
$routers = explode("@",$router);
 
// 将 控制器 反射 出来
$ref = (new \ReflectionClass($routers[0]));
 
// 获取 控制器的 方法 里面的参数
$refs = $ref->getMethod($routers[1])->getParameters();
 
$inject = [];
 
foreach ($refs as $re){
    
    //获取参数的类
    $class = $re->getClass()->name;
    // 在容器查询 是否注册过
    if (array_key_exists($class , $api->register)){
        // 获取 容器内注册的方法
        $class = $api->register[$class];
        //浅显易懂
        $classes = $ref->newInstance();
        $name = $routers[1];
        $inject[] = new $class();
    }else {
        throw new \Exception("bug");
    }
}
 
(new $classes())->{$name}(...$inject);

如果对你有帮助 麻烦点击关注我的csdn
https://blog.csdn.net/qq_3496...

你可能感兴趣的:(laravel,php)