搜索
系统检测到您的用户名不符合规范:

ReflectionClass--关于一个类的反射

浏览:4129 发布日期:2018年09月21日 分类:系统代码 关键字: 反射类 反射机制 反射API
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的详细信息我们将在下篇文章中详细讲解。
收藏
18435932584
积分:486 等级:LV2
热点推荐
(追記) (追記ここまで)
最新更新

我们

合作

网站

信息

ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。

AltStyle によって変換されたページ (->オリジナル) /