PHP的反射类ReflectionClass、ReflectionMethod使用实例

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;}
}
View Code

 

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

1.常量 Contants
2.属性 Property Names
3.方法 Method Names静态
4.属性 Static Properties
5.命名空间 Namespace
6.Person类是否为final或者abstract
7.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类的某个方法的信息:

1.是否“public”、“protected”、“private” 、“static”类型
2.方法的参数列表
3.方法的参数个数
4.反调用类的方法

代码如下:

// 执行detail方法
$method = new ReflectionMethod('Person', 'test');if ($method->isPublic() && !$method->isStatic()) {echo 'Action is right';
}
echo $method->getNumberOfParameters(); // 参数个数
echo $method->getParameters(); // 参数对象数组

 

----->>>

转载于:https://www.cnblogs.com/KeenLeung/p/6041280.html

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

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

相关文章

java 多线程跑数据_java——多线程的实现方式、三种办法解决线程赛跑、多线程数据同步(synchronized)、死锁...

多线程的实现方式&#xff1a;demo1、demo2demo1&#xff1a;继承Thread类&#xff0c;重写run()方法packagethread_test;public class ThreadDemo1 extendsThread {ThreadDemo1(){}ThreadDemo1(String szName){super(szName);}//重载run函数public voidrun() {for(int count …

struts2-19-合法用户上传文件

一&#xff1a;登录页面 成功&#xff1a;--->upload.jsp 失败&#xff1a;返回错误信息&#xff08;用户名或者密码错误&#xff09; 二&#xff1a;上传文件 登录成功&#xff1a;上传成功 未登录&#xff1a;--->login.jsp错误信息&#xff08;请登录&#xff09; 三…

maven项目和普通项目转换

转载于:https://www.cnblogs.com/yver/p/6054131.html

Gradle用户指南(1)-Gradle安装

前置条件 Gradle 需要 Java JDK 或者 JRE&#xff0c;版本是 6 及以上。Gradle 将会装载自己的 Groovy 库&#xff0c;因此&#xff0c;Groovy 不需要被安装。任何存在的 Groovy 安装都会被 Gradle 忽略。 Gradle 使用你 path 中的 JDK,或者&#xff0c;您可以设置 java_home 环…

第十六章:Java内存模型——Java并发编程实战

一、什么是内存模型&#xff0c;为什么要使用它 如果缺少同步&#xff0c;那么将会有许多因素使得线程无法立即甚至永远看到一个线程的操作结果 编译器把变量保存在本地寄存器而不是内存中编译器中生成的指令顺序&#xff0c;可以与源代码中的顺序不同处理器采用乱序或并行的方…

二进制包 mysql_二进制包安装MySQL数据库

1.1二进制包安装MySQL数据库1.1.1 安装前准备(规范)[rootMysql_server ~]# mkdir -p /home/zhurui/tools ##创建指定工具包存放路径[rootMysql_server ~]# wget http://ftp.ntu.edu.tw/pub/MySQL/Downloads/MySQL-5.5/mysql-5.5.32-linux2.6-x86_64.tar.gz ##下载二进制包[ro…

【转】String.format详解

一、前言                            String.format 作为文本处理工具&#xff0c;为我们提供强大而丰富的字符串格式化功能&#xff0c;为了不止步于简单调用 String.format("Hello %s", "John");&#xff0c;下面将笔记整理…

java提高班_2020年最新天码营-Java提高班,资源教程下载

课程名称2020年最新天码营-Java提高班&#xff0c;资源教程下载课程介绍初学者先广在精&#xff0c;关注代码背后的实现&#xff0c;关注内功修炼&#xff0c;了解实现原理和思想&#xff0c;形成自己完整的技术体系&#xff0c;知识成片之后就容易触类旁通&#xff0c;进步的速…

力扣Java解数独_LeetCode 力扣 37. 解数独

题目描述(困难难度)给定一个数独棋盘&#xff0c;输出它的一个解。解法一 回溯法从上到下&#xff0c;从左到右遍历每个空位置。在第一个位置&#xff0c;随便填一个可以填的数字&#xff0c;再在第二个位置填一个可以填的数字&#xff0c;一直执行下去直到最后一个位置。期间如…

MSSQL优化之————探索MSSQL执行计划

原文链接&#xff1a;http://blog.csdn.net/no_mIss/archive/2006/11/09/1374978.aspx 作者&#xff1a;no_mIss QQ:34813284 时间&#xff1a;2006.11.07 23:30:00 环境&#xff1a;win2003 mssql2005 最近总想整理下对MSSQL的一些理解与感悟&#xff0c;却一直没有心思和…

java web的动静分离_Apache结合Tomcat实现动静分离的方法

实验环境Apache和Tomcat均安装在IP地址为192.168.153.136的主机上 主机操作系统为centos7 实验之前关闭防火墙 ,命令&#xff1a; systemctl stop firewalld 关闭seliunx &#xff0c;命令&#xff1a;setenforce 0 实验效果为Apache处理html静态资源&#xff0c;Tomcat处理jsp…

【2016.11.16】HTML学习笔记

先是学习了思维导图的使用方法&#xff0c;然后自学了HTML 下面是自学的笔记 转载于:https://www.cnblogs.com/shan01/p/6071081.html

【2016.11.17】HTML学习笔记第二天

今天是自习 下面是我的自学内容 转载于:https://www.cnblogs.com/shan01/p/6074683.html

php 安装php soap.dll,php_soap.dll下载

php_soap.dll原因说明当你的系统出现&#xff1a;php_soap.dll缺失&#xff0c;php_soap.dll故障&#xff0c;php_soap.dll删除&#xff0c;开机php_soap.dll报错&#xff0c;php_soap.dll源码缺失&#xff0c;无法加载php_soap.dll&#xff0c;计算机丢失php_soap.dll&#xf…

1.0 C++远征:数据的封装

4-1数据的封装 1.如何进行数据封装 ​ 未进行数据的封装&#xff0c;成员变量容易发生数据的泄露&#xff1a; ​ 进行数据的封装&#xff08;这是面向对象的思想&#xff09;&#xff0c;成员变量设为private属性&#xff0c;只能通过set和get方法来赋值和取值&#xff0c;提高…

windows彻底删除php,windows如何删除php

windows如何删除php2020-10-19 07:34:59windows删除php的方法&#xff1a;首先打开windows电脑&#xff1b;然后找到PHP文件夹并选择删除&#xff1b;接着以管理员的身份运行CMD实现MySQL的卸载&#xff1b;最后停止Apache服务并重启电脑即可。推荐&#xff1a;《PHP视频教程》…

杂论-FTP

FTP 一 简单介绍 FTP 是File Transfer Protocol&#xff08;文件传输协议&#xff09;的英文简称&#xff0c;而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时&#xff0c;它也是一个应用程序&#xff08;Application&#xff09;。基于不同的操作系统有不…

CMS收集器

CMS收集周期CMS并非没有暂停&#xff0c;而是用两次短暂停来替代串行标记整理算法的长暂停&#xff0c;它的收集周期是这样&#xff1a;初始标记(CMS-initial-mark) -> 并发标记(CMS-concurrent-mark) -> 重新标记(CMS-remark) -> 并发清除(CMS-concurrent-sweep) -&g…

matlab绘制贝叶斯曲线,Matlab建立SVM,KNN和朴素贝叶斯模型分类绘制ROC曲线

原文链接&#xff1a;http://tecdat.cn/?p15508绘制ROC曲线通过Logistic回归进行分类加载样本数据。load fisheriris通过使用与versicolor和virginica物种相对应的度量来定义二元分类问题。pred meas(51:end,1:2);定义二进制响应变量。resp (1:100)>50; % Versicolor 0,…