上一节我们在文章最后谈到了参数绑定,今天我们就来说下要实现他需要哪些知识储备,可以通过PHP内置类ReflectionMethod去完成 ,当然,首先我们得了解这个类是干什么的。

我们看到官方对这个类的解释为关于一个类方法的详细信息,有趣的是他继承了一个ReflectionFunctionAbstract类并实现了一个Refletor接口。
我们先去看看ReflectionFunctionAbstract这个类吧!

这个类更多的是关于脚本运行时函数的信息。如获得函数名称、获得参数个数、获得参数,但是他是一个抽象类,必须由一个非抽象类实现它,才可以使用它里面的方法。
再看看这个Reflector接口吧!

这个接口可被任何反射类实现来约束他实现export方法。
所以最终我们罗列下ReflectionMethod应该具有的方法:
1、他本身具有的方法

2、继承自抽象类的方法
其中,在自己方法中实现了接口方的抽象方法。

接下来我们用他真正的做一些事情吧!
一、ReflectionMethod::getNumberOfParameters(获取参数数目)
<?php
class User
{
public $username;
protected $age;
private $sex;
public function __construct($args)
{
$this->username = $args['username'];
$this->age = $args['age'];
$this->sex = $args['sex'];
}
public function getUsername()
{
return $this->username;
}
public function getAge()
{
return $this->age;
}
public function getSex()
{
return $this->sex;
}
}
# 为 User类创建ReflectionClass 类
$reflect = new ReflectionClass('User'); //参数可为包含类名的字符串 或者 类的对象
# 获取已反射的类的构造函数 没有参数 返回一个 ReflectionMethod 对象
$reflectMethodObj = $reflect->getConstructor();
# 获得构造函数的参数个数
echo '构造函数参数个数为'.$reflectMethodObj->getNumberOfParameters().'个';
# getNumberOfParameters并不是ReflectionMethod自己原有的方法,而是继承自ReflectionFunctionAbstract,而得来的方法
?>二、ReflectionMethod::getParameters(ReflectionParameter 数组返回参数列表 )
<?php
class User
{
public $username;
protected $age;
private $sex;
public function __construct($args)
{
$this->username = $args['username'];
$this->age = $args['age'];
$this->sex = $args['sex'];
}
public function getUsername()
{
return $this->username;
}
public function getAge()
{
return $this->age;
}
public function getSex()
{
return $this->sex;
}
}
# 为 User类创建ReflectionClass 类
$reflect = new ReflectionClass('User'); //参数可为包含类名的字符串 或者 类的对象
# 获取已反射的类的构造函数 没有参数 返回一个 ReflectionMethod 对象
$reflectMethodObj = $reflect->getConstructor();
$arr = $reflectMethodObj->getParameters();
echo '<pre>';
print_r($arr);
# 这个时候我们想如果参数一个个能罗列出来,那么这里就可以自动获取了,我们修改这个类的构造
?>修改后的构造:
<?php
class User
{
public $username;
protected $age;
private $sex;
public function __construct($username, $age, $sex)
{
$this->username = $username;
$this->age = $age;
$this->sex = $sex;
}
public function getUsername()
{
return $this->username;
}
public function getAge()
{
return $this->age;
}
public function getSex()
{
return $this->sex;
}
}
# 为 User类创建ReflectionClass 类
$reflect = new ReflectionClass('User'); //参数可为包含类名的字符串 或者 类的对象
# 获取已反射的类的构造函数 没有参数 返回一个 ReflectionMethod 对象
$reflectMethodObj = $reflect->getConstructor();
$arr = $reflectMethodObj->getParameters();
echo '<pre>';
print_r($arr);
?> 对这样的改造是不是感觉很熟悉呢,这正是在ReflectionClass中的实例化类时推荐的那种方式!从结果我们可以看出,他把我们的每个参数变成了ReflectionParameter类的对象,这样,我们又可以拿着ReflectionParameter对象这个资源或句柄来获得一些有用的信息咯!下节我们将去看看ReflectionParameter类的具体操作及用处!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号