ReflectionClass -- 关于一个类的反射 [ 未指定版本 ]
一、 ReflectionClass::__construct(如何为一个类使用反射类[反射类的构造])
<?php
class User
{
public $username;
protected $age;
private $sex;
public function __construct($username, $age, $sex)
{
}
public function getUsername()
{
return $this->username;
}
}
# 为User类创建ReflectionClass类 参数可为包含类名的字符串 或者 类的对象
$reflect = new ReflectionClass('User');
# 返回初始化完成后的 ReflectionClass 实例。
var_dump($reflect);
?>
二、ReflectionClass::newInstance(使用反射类完成对象的创建[User实例的创建])
<?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;
}
}
# 为User类创建ReflectionClass类 参数可为包含类名的字符串 或者 类的对象
$reflect = new ReflectionClass('User');
# 使用反射类实例化User 接受可变数目的参数,用于传递到类的构造函数,和 call_user_func() 很相似。
$user = $reflect->newInstance(['username'=>'jesse', 'age'=>21, 'sex'=>'man']);
# 使用返回User类的实例调用User类中的方法。
echo $user->getUsername();
?>
三、ReflectionClass::newInsance(另一种创建对象实例的方法[不推荐])
<?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');
# 使用反射类实例化User 接受可变数目的参数,用于传递到类的构造函数,和 call_user_func() 很相似。
$user = $reflect->newInstance(['username'=>'jesse', 'age'=>21, 'sex'=>'man']); //参数为数组,将以 array 形式传递到类的构造函数
# 返回User类的实例。
echo $user->getAge();
//Tip: 这里的参数数目为可变的,可为数组,字符串。构造内的值需要根据不同类型做出对应接受。个人喜欢数组直接传递方式。
?>
以上展示如何使用一个反射类创建类的实例,按照惯例在new类名的同时需要传入构造的参数,来完成对类内部的属性初始化赋值操作。但是有个问题需要思考,一个类的构造参数往往具有不确定性,我们在反射类实例化之前可不可以自动获得需要实例化类的参数个数,并按着用户传入的值进行顺序绑定,最后完成反射类实例化操作,岂不美哉?所以,接下来我们需要将镜头转切至构造函数(方法)上面去:
四、ReflectionClass::getConstructor(获得方法详情的资源[或作句柄])
<?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 对象
$reflectMethod = $reflect->getConstructor();
var_dump($reflectMethod);
?>
在调用getConstructor方法后发现,他返回了一个RefalectionMethod对象,而RefalectionMethod类是PHP内置类,他除了为我们提供关于类方法的一些信息,如他的对外可访问性(public、protected、private),除此之外还支持动态调用执行一个方法(invoke),关于ReflectionMethod的详细信息我们将在下篇文章中详细讲解。
晏南风i 杭州
注册时间:2018-09-21
最后登录:2018-09-27
在线时长:0小时17分
最后登录:2018-09-27
在线时长:0小时17分
- 粉丝0
- 金钱10
- 威望10
- 积分110
热门源码
- 基于 Yii 2 + Bootstrap 3 搭建一套后台管理系统 CMF
- 整合完 yii2-rbac+yii2-admin+adminlte 等库的基础开发后台源码
- 适合初学者学习的一款通用的管理后台
- yii-goaop - 将 goaop 集成到 Yii,在 Yii 中优雅的面向切面编程
- yii-log-target - 监控系统异常且多渠道发送异常信息通知
- 店滴云1.3.0
- 面向对象的一小步:添加 ActiveRecord 的 Scope 功能
- Yii2 开源商城 FecShop
- 基于 Yii2 开发的多店铺商城系统,免费开源 + 适合二开
- leadshop - 基于 Yii2 开发的一款免费开源且支持商业使用的商城管理系统
共 0 条评论