【夯实PHP基础】PHP的反射机制
本文地址
分享提纲:
1. 介绍
2. 具体例子
2.1 创建Persion类
2.2 反射过程
2.3 反射后使用
1. 介绍
-- PHP5添加了一项新的功能:Reflection。这个功能使得phper可以reverse-engineer class, interface,function,method and extension。通过PHP代码,就可以得到某object的所有信息,并且可以和它交互。
-- 反射是什么?
它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。
其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。
php反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传递参数,动态调用类的静态方法。
反射api是php内建的oop技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些oop扩展被称为反射。
通过ReflectionClass,我们可以得到Person类的以下信息:
1)常量 Contants
2)属性 Property Names
3)方法 Method Names静态
4)属性 Static Properties
5)命名空间 Namespace
6)Person类是否为final或者abstract
2. 具体例子
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; publicfunction 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; } }
Persion
2.2)【反射过程】
接下来反射它,只要把类名"Person"传递给ReflectionClass就可以了:
1 $class = new ReflectionClass('Person');//建立 Person这个类的反射类 2 $instance = $class->newInstanceArgs($args);//相当于实例化Person 类
2.3)【反射后使用】
2.3.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
如果要同时获取public 和private 属性,就这样写:ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED。
通过$property->getName()可以得到属性名。
2.3.2)【获取注释】
通过getDocComment可以得到写给property的注释。
1 foreach($propertiesas$property) { 2 if($property->isProtected()) { 3 $docblock = $property->getDocComment(); 4 preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches); 5 echo$matches[1]."\n"; 6 } 7 } 8 // Output: 9 // primary_autoincrement 10 // varchar 11 // text
2.3.3)【获取类的方法】
获取方法(methods):通过getMethods() 来获取到类的所有methods。
2.3.4)【执行类的方法】
1 $instance->getBiography(); //执行Person 里的方法getBiography 2 //或者: 3 $ec=$class->getmethod('getName'); //获取Person 类中的getName方法 4 $ec->invoke($instance); //执行getName 方法
转载于:https://www.cnblogs.com/aiweixiao/p/5766978.html
【夯实PHP基础】PHP的反射机制相关推荐
- Java基础篇:反射机制详解
反射机制 反射机制.反射含义 1.利用反射获取类对象的三种方法 2.利用反射获取类对象的类名.方法.属性 3.利用反射获取类对象中的构造器.构造器参数类型.实例化构造器 实例化重点 类的加载方式不同 ...
- JAVAJ基础学习之反射机制
一.语言的动态性介绍 强类型语言(静态类型语言)是指需要进行变量/对象类型声明的语言,一般情况下需要编译执行.例如C/C++/Java /C#弱类型语言(动态类型语言)是指不需要进行变量/对象类型声明 ...
- JAVA基础,注解反射机制
文章目录 注解 (非常重要) 什么是注解 基本注解 @Override @Deprecated @SuppressWarnings @SafeVarargs @FunctionalInterface ...
- 大数据Java基础之Java反射机制
欢迎关注公众号,一起进步,共同成长. 15-1 Java反射机制概述 15-2 理解Class类并 获取Class的实例 15-3 类的加载 与ClassLoader的理解 15-4 创建运行时类的对 ...
- Android插件化开发基础之Java反射机制研究
一.获得Class对象 Class<?> c = Class.forName("classname"); 抛出ClassNotFoundException 二.获得实现 ...
- 反射 数据类型_Java基础:反射机制详解
一.什么是反射: (1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法.本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取t对 ...
- 夯实Java基础(二十一)——Java反射机制
1.反射机制概述 Java反射机制是指程序在运行状态中,对于任何一个类,我们都能够知道这个类的所有属性和方法(包括private.protected等).对于任何一个对象,我们都能够对它的属性和方法进 ...
- java基础-java反射机制
2019独角兽企业重金招聘Python工程师标准>>> 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩" ...
- Java基础与提高干货系列——Java反射机制
前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来.那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现. 正文 Java反射机制定义 Java反射机制 ...
- [Java基础] 反射机制汇总
引言 初学Java反射机制的时候,只是感觉很神奇,但是不知道学了该怎么用,所以过了一段时间就忘得差不多了:最近接触到了框架,在学习中遇到了反射,深深体会到了反射机制的神奇,回来复习了一下反射机制,写一 ...
最新文章
- Rocksdb Slice使用中的一个小坑
- C#到Java byte类型冲突的解决
- [转]老板给你的一封信:我为什么不给你涨工资
- 再谈CVE-2017-7047 Triple_Fetch和iOS 10.3.2沙盒逃逸
- 1—YOLO2:环境搭建
- 突然不能 ip访问服务器文件夹,用友U8 工作站连接不到服务器,ping IP及服务器名都正常,访问服务器共享文件夹也正常...
- 虚拟跳线软件干什么用的_疯狂刷单!用违法软件生成虚拟手机号,“骑手”半年“刷单”牟利60余万,百米内竟有万笔订单 | 申晨间...
- 安卓第三阶段实训项目:基于网络乐库音乐播放器V1.0
- 计算机技师工作调研,技师学院党委书记王庆余到计算机工程系进行“不忘初心、牢记使命”主题教育调研工作...
- Python解压压缩包
- SCUT - 240 - 宝华的文件系统 - 模拟
- C# 执行外部命令的代码
- 知识竞赛时,PPT模板如何选择确定,或自定义?
- Octavia 加速 OpenStack LBaaS 落地大规模应用场景
- word转PDF-Python编写的插件
- 赫茨伯格的双因素激励理论(1966)--zt
- 香蕉树上第十根芭蕉——深度好文-为什么要写博客
- 心肌损伤的标志物题库【1】
- rasterization(栅格化)
- 解决ping/telnet本地localhost可以通过 ping/telnet本地ip无法通过问题
热门文章
- 如何在使用 Spotify 时更好地保护您的隐私?
- 如何在 Mac 上的“屏幕使用时间”中设置限定通信?
- Movavi Picverse for mac(AI智能修图工具)
- 安全彻底的卸载工具App Cleaner Uninstaller for Mac
- 使用“Apple 诊断”来测试您的Mac 是不是存在硬件问题
- 每天一个设计模式之订阅-发布模式
- 大数据(7) - zookeeper的安装与使用
- [Python爬虫] 之二十五:Selenium +phantomjs 利用 pyquery抓取今日头条网数据
- openfire无法启动
- Linux 每日一练 :cat猫 的 反义词是啥 ? 是这个tac 哇哇哇!!