PHP反射ReflectionClass、ReflectionMethod

来源:互联网 发布:北京赛车pk10数据分析 编辑:程序博客网 时间:2024/05/21 07:12

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

反射是什么?

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

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

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

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

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

01<?php
02class Person
03{
04    /**
05     * For the sake of demonstration, we"re setting this private
06     */
07    private $_allowDynamicAttributes = false;
08 
09    /**
10     * type=primary_autoincrement
11     */
12    protected $id = 0;
13 
14    /**
15     * type=varchar length=255 null
16     */
17    protected $name;
18 
19    /**
20     * type=text null
21     */
22    protected $biography;
23 
24    public function getId()
25    {
26        return $this->id;
27    }
28 
29    public function setId($v)
30    {
31        $this->id = $v;
32    }
33 
34    public function getName()
35    {
36        return $this->name;
37    }
38 
39    public function setName($v)
40    {
41        $this->name = $v;
42    }
43 
44    public function getBiography()
45    {
46        return $this->biography;
47    }
48 
49    public function setBiography($v)
50    {
51        $this->biography = $v;
52    }
53}

 

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

  1. 常量 Contants
  2. 属性 Property Names
  3. 方法 Method Names静态
  4. 属性 Static Properties
  5. 命名空间 Namespace
  6. Person类是否为final或者abstract
  7. Person类是否有某个方法

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

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

 

1)获取属性(Properties):

01<?php
02$properties $class->getProperties();
03foreach ($properties as $property)
04{
05    echo $property->getName() . "\n";
06}
07// 输出:
08// _allowDynamicAttributes
09// id
10// name
11// biography

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

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

可用参数列表:

  • ReflectionProperty::IS_STATIC
  • ReflectionProperty::IS_PUBLIC
  • ReflectionProperty::IS_PROTECTED
  • ReflectionProperty::IS_PRIVATE

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

 

2)获取注释:

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

01<?php
02foreach ($properties as $property)
03{
04    if ($property->isProtected())
05    {
06        $docblock $property->getDocComment();
07        preg_match('/ type\=([a-z_]*) /'$property->getDocComment(), $matches);
08        echo $matches[1] . "\n";
09    }
10}
11// Output:
12// primary_autoincrement
13// varchar
14// text

 

3)获取类的方法

  • getMethods()       来获取到类的所有methods。
  • hasMethod(string)  是否存在某个方法
  • getMethod(string)  获取方法

 

4)执行类的方法:

1$instance->getName(); // 执行Person 里的方法getName
2// 或者:
3$method $class->getmethod('getName');  // 获取Person 类中的getName方法
4$method->invoke($instance);              // 执行getName 方法
5// 或者:
6$method $class->getmethod('setName');  // 获取Person 类中的setName方法
7$method->invokeArgs($instancearray('snsgou.com'));

 

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

  1. 是否“public”、“protected”、“private” 、“static”类型
  2. 方法的参数列表
  3. 方法的参数个数
  4. 反调用类的方法
view source
?
1<?php
2// 执行detail方法
3$method new ReflectionMethod('Person''test');
4if ($method->isPublic() && !$method->isStatic())
5{
6    echo 'Action is right';
7}
8echo $method->getNumberOfParameters(); // 参数个数
9echo $method->getParameters(); // 参数对象数组

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 支付宝知道名字不知道姓怎么办 东西丢了从监控里找到怎么办 两人合影其中一人去世怎么办 税务登记证注销但是发票丢失怎么办 发票登报挂失后到国税还要怎么办 广州个体执照没办国税地税怎么办 身份信息被冒用注册了公司怎么办 二级建造师注册有效期过了怎么办 公司变更法人新刻法人章怎么办 个体户年报第一年忘了报怎么办 别人说娃名字起大了怎么办? 综英美我能怎么办我也很绝望 两个人不合适且结了婚怎么办 国税局寄来的邮件没收到怎么办 新疆办理暂住证有案底不办给怎么办 我的驾驶证吊销了车年审怎么办 好几个超速分不够扣了怎么办 刚拿c1驾照扣6分怎么办 别人开我车扣12分怎么办 办健康证大便拉不出来怎么办 欠信用卡钱被网上通缉抓到后怎么办 上海房子卖了户口没地方迁怎么办 没有户口本在北京身份证丢了怎么办 武汉科目四考试居住证过期了怎么办 农行卡密码输错3次怎么办 驾照罚款缴纳了网上没消怎么办 外地驾驶证分数扣12分了怎么办 有生产日期的赠品在超市过期怎么办 6年免检车辆逾期未年检怎么办 行驶证检验有效期过期2年怎么办 骑摩托车忘带驾驶证和行驶证怎么办 驾驶证逾期未审验怎么办有什么后果 车祸至人腿部骨折沒钱偿还的怎么办 我有c4驾驶证想办c3怎么办 驾驶证和行驶证被交警扣了怎么办 行驶证被交警弄丢了怎么办 没带行驶证让警察发现怎么办 首尔转机换票换乘怎么办过境签证 驾驶证约考帐号与登密码丢失怎么办 考驾照的时候预约密码忘了怎么办 考驾照的预约密码忘了怎么办