DIY 实现 ThinkPHP 核心框架 (十三)利用反射实现参数绑定
什么是反射?
它是指在 PHP 运行状态中,扩展分析 PHP 程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为 反射 API 。主要用于框架或插件的开发。
修改 core/src/think/Container.php
中的 invokeClass()
方法。
public function invokeClass (string $class, array $vars = [])
{
// 获取反射类
$reflect = new ReflectionClass($class);
// 获取构造方法
$constructor = $reflect->getConstructor();
// 利用 bindParams 绑定参数
$args = $constructor ? $this->bindParams($constructor, $vars) : [];
// 实例化
return $reflect->newInstanceArgs($args);
}
编写 bindParams()
方法,实现参数绑定
protected function bindParams(ReflectionFunctionAbstract $reflect, array $vars = []): array
{
// 如果需要实例化的类没有参数设置,就直接返回空数组
if ($reflect->getNumberOfParameters() == 0) {
return [];
}
$args = [];
// 获取参数信息
$params = $reflect->getParameters();
foreach ($params as $param) {
$name = $param->getName();
if (isset($vars[$name])) {
$args[] = $vars[$name];
// 如果没有参数,就使用默认值
} elseif ($param->isDefaultValueAvailable()) {
$args[] = $param->getDefaultValue();
}
}
return $args;
}
在 Request
类中定义构造方法用于测试
public function __construct(string $addr, string $forum, string $lang)
{
echo '论坛网址是:' . $addr . '<br />';
echo '论坛名称是:' . $forum . '<br />';
echo '技术语言是:' . $lang . '<br />';
}
在 Index
控制器编写 show()
方法,测试绑定参数的功能
public function show ()
{
\think\Container::get('request', ['addr' => 'https://learnku.com/php', 'forum' => 'PHP 技术论坛', 'lang' => 'PHP'], true);
}
访问 diy.tp
,成功输出
论坛网址是:https://learnku.com/php
论坛名称是:PHP 技术论坛
技术语言是:PHP
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: