php的persion是,php创建Persion类,反射过程,反射后使用流程详解
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. 具体例子
创建一个Person类,然后使用ReflectionClass反射它
2.1)【创建Persion类】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就可以了:$class = new ReflectionClass('Person');//建立 Person这个类的反射类
$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属性,就要额外传个参数:
privateproperties=privateproperties=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的注释。foreach($propertiesas$property) {
if($property->isProtected()) {
$docblock = $property->getDocComment();
preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches);
echo$matches[1]."\n";
}
}
// Output:
// primary_autoincrement
// varchar
// text
2.3.3)【获取类的方法】
获取方法(methods):通过getMethods() 来获取到类的所有methods。
2.3.4)【执行类的方法】$instance->getBiography(); //执行Person 里的方法getBiography
//或者:
$ec=$class->getmethod('getName'); //获取Person 类中的getName方法
$ec->invoke($instance); //执行getName 方法
php的persion是,php创建Persion类,反射过程,反射后使用流程详解相关推荐
- SpringBoot 框架中 使用Spring Aop 、创建注解、创建枚举类 使用过程记录
1.开始 在Springboot框架中引入AOP <dependency><groupId>org.springframework.boot</groupId>&l ...
- C# 类、对象、方法和属性详解(重新排版,页面整洁)
目录 一.相关概念: 二.类的定义与语法 三.类成员:数据成员和字段 三.实例化对象:关键字:new 四.属性 五.方法的参数 一.相关概念: 对象:现实世界中的实体(世间万物皆对象) 类:具有相似属 ...
- java创建线程的方式到底有几种?(详解)
创建线程的方式到底有几种? 一,创建多线程的方式 1,官方解释 2,实现Runnable接口 3,继承Thread类 3,二者区别 3.1,本质区别 3.2,优先考虑使用第一种 二,误以为是创建线程的 ...
- 【创建型】工厂模式(Factory Pattern)详解
工厂模式分为简单工厂.工厂方法.抽象工厂模式. 这一篇说一下简单工厂.工厂方法: 简单工厂 :用来生产同一等级结构中的任意产品.(不支持拓展增加产品) 工厂方法 :用来生产同一等级结构中的固定产品.( ...
- java中创建线程的四种方式及线程池详解
众所周知,我们在创建线程时有四种方法可以用,分别是: 1.继承Thread类创建线程 2.实现Runnable接口创建线程 3.使用Callable和Future创建线程 4.使用线程池创建(使用ja ...
- 什么叫做类的类?如何获取私有的方法?Java反射机制太强大了,详解Java反射机制【Java养成】
Java学习打卡:第二十二天 内容导航 Java学习打卡:第二十二天 内容管理 Java反射机制 问题引入---数据库介绍 Java反射的介绍 class的使用 由字符串产生类和对象 获取一个类的所有 ...
- 文件系统管理 之 Linux 创建文件系统及挂载文件系统流程详解
作者:北南南北 来自: LinuxSir.Org 摘要:本文对新增硬盘,切割硬盘,创建硬盘分区,为硬盘分区创建文件系统,以及加载文件系统的流程做总结性论述:主要是为初学者弄清楚这一操作过程:本文涉及f ...
- java 类参数_Java的数据类型和参数传递(详解)
Java提供的数据类型主要分为两大类:基本数据类型和引用数据类型. Java中的基本数据类型 名称 大小 取值范围 byte型 (字节) 8bit -128-127 (-2^7到2^7-1) shor ...
- 使用IDEA创建Maven项目和Maven使用入门(配图详解)
本文详解的讲解了使用IDEA创建Maven项目,及Maven的基础入门. 1.打开IDEA,右上角选择File->New->Project 2.如图中所示选择Maven(可按自己所需添加, ...
最新文章
- Java基础语法纯小白入门
- 一篇文章讲懂Vmware网卡配置,解决常见问题
- CentOS环境搭建
- 网易云信三周年:我们只做第一
- mysql include files_安装sphinx出现错误ERROR: cannot find MySQL include files.
- github windows客户端
- 五子棋项目结束总结_居家活动系列总结
- 基于多源文档片段的神经网络排序模型(Neural Ranking Models with Multiple Document Fields)
- 接口返回buffer的16进制数据如何转换
- Linux mii-tool命令
- 获取对象属性名的方法 Object.keys() 与 Object.getOwnPropertyNames() 与 for循环
- mfsort shell语法_8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号下...
- 63 岁工程师的退休生活:开发一款计算器应用,22 天获 56800 下载!
- 《深入浅出MFC》系列之消息映射(一)
- windows 系统 局域网 屏幕共享
- H5社交漂流瓶交友源码/附安装教程
- 《SuperMap iDesktop的理论知识》
- android 应用自启管理
- 轻松玩转自动机器学习AutoML:H2O Flow
- Webpack4.0各个击破(6)loader篇