PHP 反射(Reflection)使用实例

   这篇文章主要介绍了PHP 反射(Reflection)使用实例,本文讲解了ReflectionClass、ReflectionExtension、 ReflectionFunction、ReflectionMethod、ReflectionObject、ReflectionParameter等类的使用实例,需要的朋友可以参考下

  PHP Reflection是用于获取类、扩展、方法、函数、对象、参数、属性的详细信息。

  ReflectionClass类获取类相关信息,如获取属性、方法、文档注释等。

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

<?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::export('Person');
 
$r = new ReflectionClass('Person');
 
//获取所有属性
print_r($r->getProperties());
 
/**
* 获取指定属性
* ReflectionProperty::IS_STATIC
* ReflectionProperty::IS_PUBLIC
* ReflectionProperty::IS_PROTECTED
* ReflectionProperty::IS_PRIVATE
*/
print_r($r->getProperties(ReflectionProperty::IS_PRIVATE));
 
//获取注释
print_r($r->getProperty('id')->getDocComment());
 
//获取方法
print_r($r->getMethods());

  ReflectionExtension 类用于获取扩展相关信息

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14

$re = new ReflectionExtension('Reflection');
print_r($re->getClasses()); //扩展的所有类
print_r($re->getClassNames()); //扩展所有类名
 
$dom = new ReflectionExtension('mysql');
print_r($dom->getConstants());//扩展常量
print_r($dom->getDependencies());//该扩展依赖
print_r($dom->getFunctions());//扩展方法
print_r($dom->getINIEntries());//扩展ini信息
print_r($dom->getName());//扩展名称
print_r($dom->getVersion());//扩展版本
print_r($dom->info());//扩展信息
print_r($dom->isPersistent());//是否是持久扩展
print_r($dom->isTemporary()); //是否是临时扩展

  ReflectionFunction类 用户获取函数相关信息

  ?

1
2
3
4
5

$rf = new ReflectionFunction('array_merge');
 
foreach($rf->getParameters() as $item) {
echo $item . PHP_EOL;
}

  ReflectionMethod类用户获取方法相关信息

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

class Person {
 
public $name;
 
/**
* get name of person
*/
public function getName()
{
return $this->name;
}
public function setName($v)
{
$this->name = $v;
}
}
 
$rm = new ReflectionMethod('Person', 'getName');
 
print_r($rm->isPublic());
print_r($rm->getDocComment());

  ReflectionObject 类 用于获取对象相关信息

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

class Person {
 
public $name;
 
public function __construct($name)
{
$this->name = $name;
}
 
public function getName()
{
return $this->name;
}
 
public function setName($v)
{
$this->name = $v;
}
}
 
$a = new Person('a');
 
$ro = new ReflectionObject($a);
 
print_r($ro->getMethods());

  ReflectionParameter 获取函数或方法参数的相关信息。

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

class Person {
 
public $name;
 
public function __construct($name)
{
$this->name = $name;
}
 
public function getName()
{
return $this->name;
}
 
public function setName($v)
{
$this->name = $v;
}
}
 
$p = new ReflectionParameter(array('Person', 'setName'), 0);
 
print_r($p->getPosition()); //0
print_r($p->getName()); //v

  ReflectionProperty 获取类的属性的相关信息。

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

class Person {
 
/** 测试 */
public $name;
 
public function __construct($name)
{
$this->name = $name;
}
 
public function getName()
{
return $this->name;
}
 
public function setName($v)
{
$this->name = $v;
}
}
 
$p = new ReflectionProperty('Person', 'name');
 
print_r($p->getDocComment());

时间: 2024-09-19 09:16:48

PHP 反射(Reflection)使用实例的相关文章

PHP 反射(Reflection)使用实例_php技巧

PHP Reflection是用于获取类.扩展.方法.函数.对象.参数.属性的详细信息. ReflectionClass类获取类相关信息,如获取属性.方法.文档注释等. <?php class Person { /** * For the sake of demonstration, we"re setting this private */ private $_allowDynamicAttributes = false; /** type=primary_autoincrement *

Flash AS3 中的反射 — Reflection

谢草莓和 yhc13 提供人肉翻译机支持 什么是反射反射 (Reflection) 是指在程序在运行时 (run-time) 获取类信息的方式. 诸如实现动态创建类实例, 方法等. 在很语言中都有相关的的实现, 如 Java 和 c# 等 反射有什么用在 as3 与 as2 不同, 类实例中任何元素, 如变量 (variable), 访问器 (accessor, 即 getter / setter), 方法 (method) 都是不可被 for..in 遍历的 (不是默认哦, 目前我还没找到办法

浅谈VB.NET文章系列之一 --通过例子,浅谈反射(Reflection)的应用

浅谈VB.NET文章系列之一通过例子,浅谈反射(Reflection)的应用说明:应该说这篇短文根本算不上什么深入的分析性的文章,所以在标题前加上了"浅谈"二字,希望对于一般的读者来说,可以给你一个相对直观些的对反射的认识.                                                             --2005/05/23 于东莞在这里对反射以及反射的概念在最后给出简要的解释.一.用来测试的程序集文件的建立.首先你需要建立一个类库文件(编译

C#反射(Reflection)的应用

反射(Reflection)是C#里很重要的一个特性,其它语言也有这个特性,比如JAVA.反射这个特性是很实用的,这个到底有多实用呢,我也说不清,如果使用过struts, hibernate, spring等等这些框架的话,便会知道反射这个特性是多么的强大了.好像我列出的都是JAVA的框架,.NET的框架我不了解,有没有我都不知道.但在我接触过的那些框架中,没有一个框架是不使用反射的,没有反射特性的语言除外. 最近比较累,我就不多说了,直接看代码吧. 这是Model程序集中的一个类: Code

C#反射(Reflection)对类的属性get或set值实现思路_实用技巧

近段时间,有朋友叫Insus了解一下反射(Reflection)方面的知识,反射提供了封装程序集.模块和类型的对象(Type类型).可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性.如果代码中使用了属性,可以利用反射对它们进行访问. 下面的例子,是Insus练习对一个类别的属性进行set和get值. 首先写一个类,再写一个可读写的属性: 复制代码 代码如下: using System; using System.Collections.Ge

Flash AS 3.0菜鸟学飞教程:用反射动态创建实例

使用new运算符创建对象或实例时,直接调用了某个具体类的构造函数,而在编写程序时,经常需要动态地创建类的实例,这时可以使用反射来创建实例. 例如,如果仅知道某个实例,而不知道实例对应的类,就可以用反射来创建实例.AS3中的所有类都属于Class类型,例如,MovieClip是一个Class,Bitmap也是一个Class. 例: 1.新建一个Flash文档 2.单击图层第一帧,打开动作面板,输入代码: //动态得到类的构造函数 var classcontructor:Class = MovieC

Java反射之类的实例对象的三种表示方式总结_java

如下所示: <span style="font-size:14px;">package com.imooc.reflect; public class ClassDemo1 { public static void main(String[] args) { //Foo的实例对象如何表示 Foo foo1 = new Foo();//foo1就表示出来了 //Foo这个类,也是一个实例对象,Class类的实例对象,如何表示呢. //任何一个类都是Class的实例对象,这个实

实例介绍PHP的Reflection反射机制_php实例

PHP5添加了一项新的功能:Reflection.这个功能使得程序员可以reverse-engineer class, interface,function,method and extension.通过PHP代码,就可以得到某object的所有信息,并且可以和它交互. 假设有一个类Person: 复制代码 代码如下: class Person {   /**      * For the sake of demonstration, we"re setting this private    

C#反射概念以及实例详解

C#反射的入门学习首先要明白C#反射提供了封装程序集.模块和类型的对象等等.那么这样可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性.如果代码中使用了属性,可以利用反射对它们进行访问. 一个最简单的C#反射实例,首先编写类库如下: using System; namespace ReflectionTest { public class WriteTest { //public method with parametors public v