老师,依赖注入、控制反转、反射与平时使用时有啥区别和优势
来源: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/ 这里搜你上面说的关键词就好了
312019-10-25 -
爱因诗贤
2019-09-25
容器中有个类的反射机制,通过递归循环得到想到的类,这个类的依赖注入,反射机制一般在__construct 方法参数里面,容器里面一般获取类的实例是通过 __make 方法,这个方法的参数也有依赖注入的类
20 -
爱因诗贤
2019-09-25
这个主要是在容器中被使用,你好,同学可以重复多听几次 容器那一章,依赖注入,反射机制是方便容器使各个功能类解耦的
20
相似问题