PHP反射ReflectionClass、ReflectionMethod 入门教程

PHP反射ReflectionClass、ReflectionMethod 入门教程    

作者:SNSGOU 发布于:2014-03-16 16:44:00  分类:PHP   浏览(6145) 

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        return $this->id;
26    }
27 
28    public function setId($v) {
29        $this->id = $v;
30    }
31 
32    public function getName() {
33        return $this->name;
34    }
35 
36    public function setName($v) {
37        $this->name = $v;
38    }
39 
40    public function getBiography() {
41        return $this->biography;
42    }
43 
44    public function setBiography($v) {
45        $this->biography = $v;
46    }
47}

 

一、通过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):

1$properties $class->getProperties();
2foreach ($properties as $property) {
3    echo $property->getName() . "\n";
4}
5// 输出:
6// _allowDynamicAttributes
7// id
8// name
9// 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的注释。 

01foreach ($properties as $property) {
02    if ($property->isProtected()) {
03        $docblock $property->getDocComment();
04        preg_match('/ type\=([a-z_]*) /'$property->getDocComment(), $matches);
05        echo $matches[1] . "\n";
06    }
07}
08// Output:
09// primary_autoincrement
10// varchar
11// 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. 反调用类的方法
1// 执行detail方法
2$method new ReflectionMethod('Person''test');
3 
4if ($method->isPublic() && !$method->isStatic()) {
5    echo 'Action is right';
6}
7echo $method->getNumberOfParameters(); // 参数个数
8echo $method->getParameters(); // 参数对象数组

转载于:https://www.cnblogs.com/lovezbs/p/4435843.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle开发常用知识

一、利用游标实现循环嵌套 在对oracle数据进行操作时我们会经常碰到循环甚至循环嵌套的情况。这个时候游标的作用就体现出来了。 DECLAREvId NUMBER(19);vDate DATE;--a表游标定义CURSOR a_cursor ISSELECT DISTINCT o.employeeId FROM operations o WHERE o.employeeId IS N…

条件控制(if ) ( case)

一&#xff1a;IF应用格式 (1)                  (2)                (3) IF 条件 THEN           IF 条件 THEN            IF 条件1 THEN --代码块               --代码块          …

使用临时表解决union和order by不能同时使用的问题

最近遇见了这样一个问题&#xff0c;有4张表&#xff0c;A&#xff08;单据&#xff09;表&#xff0c;B&#xff08;产品&#xff09;表&#xff0c;C&#xff08;产品类型&#xff09;&#xff0c;D&#xff08;单据产品关联表&#xff09;。 B表有唯一对应的类型C&#xff…

2.3线性表的链式存储和运算—双向链表

以上讨论的单链表的结点中只有一个指向其后继结点的指针域next&#xff0c;因此若已知某结点的指针为p&#xff0c;其后继结点的指针则为p->next &#xff0c;而找其前驱则只能从该链表的头指针开始&#xff0c;顺着各结点的next 域进行&#xff0c;也就是说找后继的时间性能…

Oracle常用字符串操作

参考&#xff1a; 一、oracle操作字符串&#xff1a;拼接、替换、截取、查找&#xff1b; 二、oracle中的trim函数使用介绍 --字符串去空格 --输出:a b c; SELECT TRIM( a b c ) || ; FROM dual; SELECT TRIM(BOTH FROM a b c ) || ; FROM dual; --输出: a …

linux下面安装maven

maven作为最近比较火的项目管理工具&#xff0c;对项目的jar包及其开元添加相应的插件的管理&#xff0c;很方便。 安装maven&#xff1a; 在官网上面去下载最新的maven的压缩包&#xff0c;apache-maven-3.3.1-bin.tar.gz. 将下载的压缩包保存/usr/local/maven下&#xff0c;进…

Hibernate懒加载问题

刚开始接触这种数据持久化框架时&#xff0c;使用的是Maybatis&#xff0c;相较于最原始的JDBCSQL模式&#xff0c;Maybatis简直就是神器&#xff0c;特别是在用过Maybatis动态SQL后&#xff0c;简直就开始对Maybatis爱不释手。后来工作要求&#xff0c;又接触到了Hibernate&am…

实现点击按钮后,倒计时60秒才能再次点击

转载于:https://www.cnblogs.com/liu201312/p/4447710.html

通过栈(Stack)实现对树的遍历

说到数的遍历树&#xff0c;长期以来的第一印象都是通过递归去实现。然而今天看了某位前辈的代码&#xff0c;才发现使用栈去实现遍历是那么简单。理论上通过数组也是可以实现同等功能的&#xff0c;毕竟Stack也是通过数据去实现的。 package com.sysway.ui.widget;import jav…

设计模式_01_单一原则

设计模式_01_单一原则 package designPatternOf_01; /*** 单一原则示例&#xff1a;动物呼吸* 引入的问题&#xff1a;鱼不吸空气&#xff0c;吸水*/ public class SinglePrinciple_01 {public static void main(String[] args) {Animal animalnew Animal();animal.breath(&quo…

StroyBoard中UICollectionView中添加Header和footer

到Storyboard中&#xff0c;选择collection view controller中的"Collection View"。在Attributes inspector中&#xff0c;选择"Section Header"和"Section Footer",一旦选中你就会在屏幕中看到下面的的显示&#xff1a; 最重要的是&#xff0c…

树形结构数据汇总查询解决方案+优化求助

最近遇到一个地区数据汇总的问题&#xff0c;地区下的地址呈树形结构&#xff0c;&#xff08;简化结构&#xff09;如A市下有B、C区&#xff0c;B区下有D、E街道。先要查询所有地区的人数&#xff08;包括子区域&#xff09;&#xff0c;如A的人数直属A的人数B的人数C的人数D的…

find 是区分大小写的。对于不区分大小写的写法(转载)

转自&#xff1a;http://justwinit.cn/post/3633/ 默认情况下&#xff0c;find 是区分大小写的。对于不区分大小写的 find&#xff0c;将 -iname 测试替换为 -name 测试。find downloads -iname "*.gif"downloads/.xvpics/Calendar05_enlarged.gifdownloads/lcmgcfe…

ORACLE会话以及SQL执行信息查询

select t.BLOCKING_SESSION,t.SQL_ID,t.SID,t.SERIAL#,t.MACHINE,t.PROGRAM,t.ACTION,t.LOGON_TIME "登录时间",trunc((sysdate - t.LOGON_TIME) * 24 * 60 * 60) || s "登录时长",trunc(nvl(s.ELAPSED_TIME / decode(s.EXECUTIONS, 0, 1, s.EXECUTIONS) /…

Dom4j 学习笔记

dom4j 是一种解析 XML 文档的开放源代码 XML 框架。dom4j下载地址 本文主要记载了一些简单的使用方法。 一、xml文件的解析 dom4j既可以解析普通的xml文件&#xff0c;也可以解析一个InputStream&#xff0c;先看看xml文件长什么样子&#xff1a; <books><book>&l…

交叉连接(CROSS JOIN)的实际应用

一次偶然的机会&#xff0c;使用到了万年不用的交叉连接&#xff08;CROSS JOIN&#xff09; 业务场景如下&#xff1a; 1、存在多个运营商&#xff0c;每个运营商下面都有各种类型的设备&#xff0c;不同运营商的设备不完全相同&#xff1b; 2、任何设备有且仅有两种用途‘…

Atitit.操作注册表 树形数据库 注册表的历史 java版本类库总结

Atitit.操作注册表 树形数据库 注册表的历史 java版本类库总结 1. 注册表是树形数据库 1 2. 注册表的由来 1 3. Java 操作注册表 2 3.1. 使用Preferences API &#xff08;限定访问路径了&#xff09; 2 3.2. 使用JNI 3 3.3. Jregistrykey 推荐 4 3.4. Jregistry 4 4. org.ope…

C# xml文件读取与修改

c#读写xml文件已知有一个XML文件&#xff08;bookstore.xml&#xff09;如下&#xff1a; Code<?xml version"1.0" encoding"gb2312"?><bookstore> <book genre"fantasy" ISBN"2-3631-4"> <title>Obero…

外连接从表过滤

1、使用left join时从表的过滤 WITH a AS( SELECT A aid FROM dual UNION ALL SELECT B FROM dual UNION ALL SELECT C FROM dual UNION ALL SELECT D FROM dual UNION ALL SELECT E FROM dual ), b AS( SELECT A aid,10 num,1 type FROM dual UNION ALL SELECT B,20,2 FROM d…

php pcntl 多进程学习

1、捕获子进程退出&#xff08;监听SIGCHLD信号&#xff0c;然后调用 pcntl_wait 函数&#xff09; declare(ticks1);pcntl_signal(SIGCHLD, "sig_handler"); function sig_handler($signo) {switch ($signo) {case SIGCHLD:$status 0;$child_id pcntl_wait($statu…