上一节我们在文章最后谈到了参数绑定,今天我们就来说下要实现他需要哪些知识储备,可以通过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类的具体操作及用处!