老师,依赖注入、控制反转、反射与平时使用时有啥区别和优势

来源:5-8 路由定义

qq_深都_03155654

2019-08-24

class FileLog
{

}

class User
{
protected $log;

public function __construct(FileLog $log)
{
    $this->log = $log;
}

public function login()
{
    // 登录成功,记录登录日志
    echo 'login success...';
    $this->log->write();
}

}

function make($concrete){

$reflector = new ReflectionClass($concrete);
$constructor = $reflector->getConstructor();
// 为什么这样写的? 主要是递归。比如创建FileLog不需要传入参数。
if(is_null($constructor)) {
    return $reflector->newInstance();
}else {
    // 构造函数依赖的参数
    $dependencies = $constructor->getParameters();
    // 根据参数返回实例,如FileLog
    $instances = getDependencies($dependencies);
    return $reflector->newInstanceArgs($instances);
}

}

function getDependencies($paramters) {
$dependencies = [];

foreach ($paramters as $paramter) {
    $dependencies[] = make($paramter->getClass()->name);
}
return $dependencies;

}

$user = make(‘User’);
$user->login();

与下面这个有啥区别, __construct(FileLog $log)都 是写死的,好像与传参new FileLog()都一个意思吧

class FileLog
{

}

class User
{
protected $log;

public function __construct($log)
{
    $this->log = $log;
}

public function login()
{
    // 登录成功,记录登录日志
    echo 'login success...';
    //$this->log->write();
}

}

$user = new User(new FileLog());
$user->login();

写回答

3回答

kingofzihua

2019-09-25

你说的这些对于你作为使用者来说,基本上没有毛用,这些是框架层次的东西,所以说,你的问题应该是说,依赖注入、控制反转、反射 它在框架中解决了什么问题, 简单来说,解耦。


依赖注入:

首先有依赖,当前的类,或者是方法需要依赖外部的类。然后才有依赖的注入,对于你所依赖的类,框架自动将你需要的类注入到项目里面。


反射:

tp提供的仅仅是一个框架,它本身并不知道你使用的场景或者是你的业务,你的业务都是你自己写的代码,但是tp需要知道这个请求需要交给那个类哪个方法进行处理,所以,他必须在程序中能够动态的获取那个类,并实例化这个类(你代码中有new Controller的操作吗?没有吧?)为啥能?或者这样问,我怎么才能通过一个类名,获取到示例化的对象呢?思考下, 貌似只有反射才能解决呢。


首先了解IOC容器,DI, 然后再看这些, 容器是基础!去https://learnku.com/laravel/ 这里搜你上面说的关键词就好了



 初学依赖注入   Laravel 服务容器实现原理

3
1
singwa
这位同学回复的很棒。
2019-10-25
共1条回复

爱因诗贤

2019-09-25

容器中有个类的反射机制,通过递归循环得到想到的类,这个类的依赖注入,反射机制一般在__construct 方法参数里面,容器里面一般获取类的实例是通过 __make 方法,这个方法的参数也有依赖注入的类

2
0

爱因诗贤

2019-09-25

这个主要是在容器中被使用,你好,同学可以重复多听几次 容器那一章,依赖注入,反射机制是方便容器使各个功能类解耦的

2
0

BAT资深工程师解析Tp5+Tp6底层源码

一门课掌握主流Tp5+最新Tp6框架底层,拥抱新潮流

691 学习 · 154 问题

查看课程