共计 1857 个字符,预计需要花费 5 分钟才能阅读完成。
最近在学习 java。看 java 入门到精通。在反射部分 突然对以前不懂的 依赖注入 豁然开朗
依赖注入 就是通过反射 去获取对象中需要的参数 类
下面是模仿 laravel 实现过程。比较 low
原创 转载请注明出处
<?php
/**
* 依赖注入取决的 就是 容器和反射 两个部分
* 可以考虑一个服务提供者
* 然后 在服务提供者进行注册
* 服务提供者 在生命周期内
* 进行注册 或者其他的操作
* 需要实现接口
* 接口 register 为注册 handle 为执行 boot 为监听
*/
namespace app;
use app\interfaces\RequestInterface;
use app\interfaces\SendSmsInterface;
/**
* 实现接口
*/
class Request implements RequestInterface
{public $id = 0 ;}
class SendSmsService implements SendSmsInterface
{public $name = "This is sendSmsSevice";}
namespace app\interfaces;
/**
* 接口类
* 解耦使用
*/
interface RequestInterface{}
namespace app\interfaces;
interface SendSmsInterface {}
namespace bpp;
/**
* 容器类
*/
class Container
{public $register = [];
public function register(array $bind){foreach($bind as $concrete){if($concrete !instanceof Closure){throw new Exception();
}
}
$this->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…
正文完