文档章节

PHP反射ReflectionClass、ReflectionMethod

BearCatYN
 BearCatYN
发布于 2015/11/16 16:09
字数 845
阅读 344
收藏 3

PHP5 具有完整的反射API,添加对类、接口、函数、方法和扩展进行反向工程的能力。

反射是什么?

它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。

其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。

PHP反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传递参数,动态调用类的静态方法。

反射api是PHP内建的OOP技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些OOP扩展被称为反射。

 

平常我们用的比较多的是 ReflectionClass类 和 ReflectionMethod类,例如:

<?php
class Person {

	/**
	 * For the sake of demonstration, we"re setting this private
	 */
	private $_allowDynamicAttributes = false;

	/**
	 * type=primary_autoincrement
	 */
	protected $id = 0;

	/**
	 * type=varchar length=255 null
	 */
	protected $name;

	/**
	 * type=text null
	 */
	protected $biography;

	public function getId() {
		return $this->id;
	}

	public function setId($v) {
		$this->id = $v;
	}

	public function getName() {
		return $this->name;
	}

	public function setName($v) {
		$this->name = $v;
	}

	public function getBiography() {
		return $this->biography;
	}

	public function setBiography($v) {
		$this->biography = $v;
	}
}


一、通过ReflectionClass,我们可以得到Person类的以下信息:

常量 Contants

属性 Property Names

方法 Method Names静态

属性 Static Properties

命名空间 Namespace

Person类是否为final或者abstract

Person类是否有某个方法

接下来反射它,只要把类名"Person"传递给ReflectionClass就可以了:

$class = new ReflectionClass('Person'); // 建立 Person这个类的反射类  
$instance  = $class->newInstanceArgs($args); // 相当于实例化Person 类

1)获取属性(Properties):

$properties = $class->getProperties();
foreach ($properties as $property) {
	echo $property->getName() . "\n";
}
// 输出:
// _allowDynamicAttributes
// id
// name
// biography


默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数:

$private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);

可用参数列表:

ReflectionProperty::IS_STATIC

ReflectionProperty::IS_PUBLIC

ReflectionProperty::IS_PROTECTED

ReflectionProperty::IS_PRIVATE

通过$property->getName()可以得到属性名。

2)获取注释:

通过getDocComment可以得到写给property的注释。 

foreach ($properties as $property) {
	if ($property->isProtected()) {
		$docblock = $property->getDocComment();
		preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches);
		echo $matches[1] . "\n";
	}
}
// Output:
// primary_autoincrement
// varchar
// text

3)获取类的方法

getMethods()       来获取到类的所有methods。

hasMethod(string)  是否存在某个方法

getMethod(string)  获取方法

 

4)执行类的方法:

$instance->getName(); // 执行Person 里的方法getName
// 或者:
$method = $class->getmethod('getName');	// 获取Person 类中的getName方法
$method->invoke($instance);				// 执行getName 方法
// 或者:
$method = $class->getmethod('setName');	// 获取Person 类中的setName方法
$method->invokeArgs($instance, array('snsgou.com'));

二、通过ReflectionMethod,我们可以得到Person类的某个方法的信息:

是否“public”、“protected”、“private” 、“static”类型

方法的参数列表

方法的参数个数

反调用类的方法

// 执行detail方法
$method = new ReflectionMethod('Person', 'test');

if ($method->isPublic() && !$method->isStatic()) {
	echo 'Action is right';
}
echo $method->getNumberOfParameters(); // 参数个数
echo $method->getParameters(); // 参数对象数组


本文转载自:http://www.php-note.com/article/detail/42

BearCatYN
粉丝 26
博文 158
码字总数 11947
作品 0
朝阳
程序员
私信 提问
php 反射类简介

反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复 杂,可扩展的应用。其用途如:自动加载插件,自动生成文档,甚至可用来扩充 PHP 语言。php 反射api 由若干类组成,...

晨曦之光
2012/03/09
1K
0
如何使用反射来分析PHP的数据结构

更准备的说是 如何用PHP分析类内部的结构。 介绍 当我开始学习PHP编程时,可能并不知道 的强大功能,主要原因是我不需要它来设计我的类,模块甚至是包等等,但是它在很多地方都有非常不错的能...

如来神掌
2018/06/02
26
0
thinkphp 控制器调度详解-ReflectionClass,ReflectionMethod

1.如何通过地址栏参数来得到模块名称和控制器名称(即使在有路由和开了重写模块的情况下) 在之前的博文中已经有了比较详细的说明:http://my.oschina.net/u/1178986/blog/201206003 2.tp是如何...

share_good
2014/02/21
1K
0
php_ReflectionClass_反射

<?php class Menu{ private $webiste; public $param; public function construct(){ $this->webiste='blog'; } public function getAll($catid=0,$limit=6){ if($catid){ printr( array('首......

喵王不瞌睡
2016/03/21
30
0
Macroable 宏指令详解

百度百科的定义: 计算机科学里的宏(Macro),是一种批量处理的称谓。一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的...

echojson
04/01
11
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
昨天
64
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
昨天
26
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
昨天
43
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
昨天
27
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
昨天
44
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部