DIY 实现 ThinkPHP 核心框架 (十四)利用反射实现依赖注入
依赖注入由容器自动完成,有了反射机制之后,可以实现自主依赖注入。修改Rrequest
类的构造方法如下
namespace think;
class Request
{
public function __construct(App $app, $name)
{
var_dump($app instanceof App, $name);
}
}
同时修改 bindParams()
方法,用 getClass()
方法获取参数类型提示,用 getName()
方法获取创建实例的类名。
protected function bindParams(ReflectionFunctionAbstract $reflect, array $vars = []): array
{
// 如果类没有配置参数,就直接返回空数组
if ($reflect->getNumberOfParameters() == 0) {
return [];
}
$args = [];
// 获取参数信息
$params = $reflect->getParameters();
foreach ($params as $param) {
$name = $param->getName();
$class = $param->getClass();
if (isset($vars[$name])) {
$args[] = $vars[$name];
// 如果没有传参,就采用默认参数
} elseif ($param->isDefaultValueAvailable()) {
$args[] = $param->getDefaultValue();
// 如果获取到参数类型,进一步实现实例化
} elseif ($class) {
$args[] = $this->make($class->getName());
}
}
访问 diy.tp
,成功打印出
bool(true) string(4) "five"
表明成功利用反射实现依赖注入,之后删除 Request
类的构造函数,以便以后的演示。
本作品采用《CC 协议》,转载必须注明作者和本文链接