本文地址

分享提纲:

  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. 具体例子


创建一个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就可以了:

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的反射机制相关推荐

  1. Java基础篇:反射机制详解

    反射机制 反射机制.反射含义 1.利用反射获取类对象的三种方法 2.利用反射获取类对象的类名.方法.属性 3.利用反射获取类对象中的构造器.构造器参数类型.实例化构造器 实例化重点 类的加载方式不同 ...

  2. JAVAJ基础学习之反射机制

    一.语言的动态性介绍 强类型语言(静态类型语言)是指需要进行变量/对象类型声明的语言,一般情况下需要编译执行.例如C/C++/Java /C#弱类型语言(动态类型语言)是指不需要进行变量/对象类型声明 ...

  3. JAVA基础,注解反射机制

    文章目录 注解 (非常重要) 什么是注解 基本注解 @Override @Deprecated @SuppressWarnings @SafeVarargs @FunctionalInterface ...

  4. 大数据Java基础之Java反射机制

    欢迎关注公众号,一起进步,共同成长. 15-1 Java反射机制概述 15-2 理解Class类并 获取Class的实例 15-3 类的加载 与ClassLoader的理解 15-4 创建运行时类的对 ...

  5. Android插件化开发基础之Java反射机制研究

    一.获得Class对象 Class<?> c = Class.forName("classname"); 抛出ClassNotFoundException 二.获得实现 ...

  6. 反射 数据类型_Java基础:反射机制详解

    一.什么是反射: (1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法.本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取t对 ...

  7. 夯实Java基础(二十一)——Java反射机制

    1.反射机制概述 Java反射机制是指程序在运行状态中,对于任何一个类,我们都能够知道这个类的所有属性和方法(包括private.protected等).对于任何一个对象,我们都能够对它的属性和方法进 ...

  8. java基础-java反射机制

    2019独角兽企业重金招聘Python工程师标准>>> 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩" ...

  9. Java基础与提高干货系列——Java反射机制

    前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来.那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现. 正文 Java反射机制定义 Java反射机制 ...

  10. [Java基础] 反射机制汇总

    引言 初学Java反射机制的时候,只是感觉很神奇,但是不知道学了该怎么用,所以过了一段时间就忘得差不多了:最近接触到了框架,在学习中遇到了反射,深深体会到了反射机制的神奇,回来复习了一下反射机制,写一 ...

最新文章

  1. Rocksdb Slice使用中的一个小坑
  2. C#到Java byte类型冲突的解决
  3. [转]老板给你的一封信:我为什么不给你涨工资
  4. 再谈CVE-2017-7047 Triple_Fetch和iOS 10.3.2沙盒逃逸
  5. 1—YOLO2:环境搭建
  6. 突然不能 ip访问服务器文件夹,用友U8 工作站连接不到服务器,ping IP及服务器名都正常,访问服务器共享文件夹也正常...
  7. 虚拟跳线软件干什么用的_疯狂刷单!用违法软件生成虚拟手机号,“骑手”半年“刷单”牟利60余万,百米内竟有万笔订单 | 申晨间...
  8. 安卓第三阶段实训项目:基于网络乐库音乐播放器V1.0
  9. 计算机技师工作调研,技师学院党委书记王庆余到计算机工程系进行“不忘初心、牢记使命”主题教育调研工作...
  10. Python解压压缩包
  11. SCUT - 240 - 宝华的文件系统 - 模拟
  12. C# 执行外部命令的代码
  13. 知识竞赛时,PPT模板如何选择确定,或自定义?
  14. Octavia 加速 OpenStack LBaaS 落地大规模应用场景
  15. word转PDF-Python编写的插件
  16. 赫茨伯格的双因素激励理论(1966)--zt
  17. 香蕉树上第十根芭蕉——深度好文-为什么要写博客
  18. 心肌损伤的标志物题库【1】
  19. rasterization(栅格化)
  20. 解决ping/telnet本地localhost可以通过 ping/telnet本地ip无法通过问题

热门文章

  1. 如何在使用 Spotify 时更好地保护您的隐私?
  2. 如何在 Mac 上的“屏幕使用时间”中设置限定通信?
  3. Movavi Picverse for mac(AI智能修图工具)
  4. 安全彻底的卸载工具App Cleaner Uninstaller for Mac
  5. 使用“Apple 诊断”来测试您的Mac 是不是存在硬件问题
  6. 每天一个设计模式之订阅-发布模式
  7. 大数据(7) - zookeeper的安装与使用
  8. [Python爬虫] 之二十五:Selenium +phantomjs 利用 pyquery抓取今日头条网数据
  9. openfire无法启动
  10. Linux 每日一练 :cat猫 的 反义词是啥 ? 是这个tac 哇哇哇!!