简介

就算是类成员定义为private也可以在外部访问,不用创建类的实例也可以访问类的成员和方法。

php自5.0版本以后添加了反射机制,它提供了一套强大的反射api,允许你在php运行环境中,访问和使用类、方法、属性、参数和注释等,其功能十分强大,经常用于高扩展的php框架,自动加载插件,自动生成文档,甚至可以用来扩展php语言。由于它是php內建的oop扩展,为语言本身自带的特性,所以不需要额外添加扩展或者配置就可以使用。更多内容见。

反射类型

php反射api会基于类,方法,属性,参数等维护相应的反射类,已提供相应的调用api。

类型 说明
reflector reflector 是一个接口,被所有可导出的反射类所实现(implement)
reflection 反射(reflection)类
reflectionclass 报告了一个类的有关信息
reflectionzendextension 报告zend扩展的相关信息
reflectionextension 报告了php扩展的有关信息
reflectionfunction 报告了一个函数的有关信息
reflectionfunctionabstract reflectionfunction 的父类
reflectionmethod 报告了一个方法的有关信息
reflectionobject 报告了一个对象(object)的相关信息
reflectionparameter 取回了函数或方法参数的相关信息
reflectionproperty 报告了类的属性的相关信息

访问

假设定义了一个类 user,我们首先需要建立这个类的反射类实例,然后基于这个实例可以访问 user 中的属性或者方法。不管类中定义的成员权限声明是否为public,都可以获取到。

注意:创建反射类时传送的类名,必须包含完整的命名空间,即使使用了 use 关键字。否则找不到类名会抛出异常。

交互

一旦创建了反射类的实例,我们不仅可以通过反射类访问原来类的方法和属性,还能创建原来类的实例或则直接调用类里面的方法。

注意事项

  1. 直接访问 protected 或则 private 的熟悉或者方法会抛出异常
  2. 需要调用指定的 reflectionproperty 或则 reflectionmethod 对象 setaccessible(true)方法才能访问非公有成员
  3. 修改非公有成员的访问权限只作用于当前的反射类的实例
  4. 需要注意获取静态成员和非静态成员所使用的方法不一样
  5. 获取父类成员的方法和一般的不一样

有时间会整理出反射类的api表,详细的api列表可以先查阅。

到此这篇关于php反射机制案例讲解的文章就介绍到这了,更多相关php反射机制内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!