原文地址: http://www.nowamagic.net/php/php_Reflection.php

PHP5添加了一项新的功能:Reflection。这个功能使得程序员可以

reverse-engineer[逆向工程] class, interface,function,method and extension[扩展库支持]。

通过PHP代码,就可以得到某object的所有信息,并且可以和它交互。

如假设以下Person类:

 1 class Person {
 2     /**
 3      * For the sake of demonstration, we"re setting this private
 4      */
 5     private $_allowDynamicAttributes = false;
 6
 7     /**
 8      * type=primary_autoincrement
 9      */
10     protected $id = 0;
11
12     /**
13      * type=varchar length=255 null
14      */
15     protected $name;
16
17     /**
18      * type=text null
19      */
20     protected $biography;
21     public function getId() {
22         return $this->id;
23     }
24     public function setId($v) {
25         $this->id = $v;
26     }
27     public function getName() {
28         return $this->name;
29     }
30     public function setName($v) {
31         $this->name = $v;
32     }
33     public function getBiography() {
34         return $this->biography;
35     }
36     public function setBiography($v) {
37         $this->biography = $v;
38     }
39 }

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

  • 常量 Contants
  • 属性 Property Names
  • 方法 Method Names
  • 静态属性 Static Properties
  • 命名空间 Namespace
  • Person类是否为final或者abstract

只要把类名"Person"传递给ReflectionClass就可以了:

1 $class = new ReflectionClass('Person');

* 获取属性(Properties):

1 $properties = $class->getProperties();
2 foreach($properties as $property) {
3     echo $property->getName()."\n";
4 }
5 // 输出:
6 // _allowDynamicAttributes
7 // id
8 // name
9 // biography

默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数:

1 $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_PRIVATE

通过$property->getName()可以得到属性名,通过getDocComment可以得到写给property的注释。

 1 foreach($properties as $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

有点不可思议了吧。竟然连注释都可以取到。

* 获取方法(methods):通过getMethods() 来获取到类的所有methods。返回的是ReflectionMethod对象的数组。

不再演示。

赋一个利用反射加载类实例的工具类写法:

<?php
/*** Desc: 反射加载类* Class: ClassLoader* Package: App\Lib* User: zb* Date: 2019/5/22 15:21*/namespace App\Lib;class ClassLoader
{private static $obj = [];/*** 上传类map*/private static function uploadClassMap (){$map = ['image' => 'App\Lib\Upload\Image',//key为传递参数key'video' => 'App\Lib\Upload\Video',];return $map;}/*** model类map*/private static function modelClassMap (){$map = ['video' => 'App\Model\Video',];return $map;}/*** aliyun类map*/private static function aliyunClassMap (){$map = ['vod' => 'App\Lib\Aliyun\AliyunVod',];return $map;}/*** cache类map*/private static function cacheClassMap (){$map = ['video' => 'App\Lib\Cache\Video',];return $map;}/*** 类实例map指南* @param string $guideKey 指南key* @param string $classKey classKey* @return array|bool*/private static function guideClassMap (string $guideKey, string $classKey){$guideKey = strtolower($guideKey);$guideMap = ['upload' => self::uploadClassMap(),'model' => self::modelClassMap(),'aliyun' => self::aliyunClassMap(),'cache' => self::cacheClassMap(),];return isset($guideMap[$guideKey][$classKey]) ? $guideMap[$guideKey][$classKey] : array();}/*** @param string $guideKey guideKey* @param string $classKey classKey键* @param array $params 构造函数参数* @param bool $instance 是否需要实例化* @return object|string 返回obj或字符串* @throws \ReflectionException*/public static function initClass (string $guideKey, string $classKey, $params = [], $instance = true){if (!$params && isset(self::$obj[$guideKey . '-' . $classKey]) && is_object(self::$obj[$guideKey . '-' . $classKey])) {return self::$obj[$guideKey . '-' . $classKey];} else {unset(self::$obj[$guideKey . '-' . $classKey]);}if (!self::guideClassMap($guideKey, $classKey)) {throw new \ReflectionException('加载类不存在');}$class = self::guideClassMap($guideKey, $classKey);try {$obj = $instance ? (new \ReflectionClass($class))->newInstanceArgs($params) : $class;if (!$params) {self::$obj[$guideKey . '-' . $classKey] = $obj;}return $obj;} catch (\ReflectionException $e) {throw new \ReflectionException('类加载失败');}}}

转载于:https://www.cnblogs.com/deverz/p/6138373.html

PHP的Reflection反射机制相关推荐

  1. Java反射机制的基本概念与使用_Java进阶之reflection(反射机制)——反射概念与基础...

    反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...

  2. 【韩顺平】Java反射机制笔记

    文章目录 1.前言 2.一个需求引出反射 3.反射机制 3.1 Java Reflection 3.2 反射机制原理图 3.3 反射机制可以完成的功能 3.4 反射相关的主要类 3.5 反射优点和缺点 ...

  3. 【Java】反射( reflection)机制 详解

    目录 1. 定义 2. 用途(了解即可) 3. 反射的基本信息 4. 反射相关的类(重要) 4.1 Class类(反射机制的起源 ) 4.2 Class类中的相关方法(方法的使用方法在后边的示例当中) ...

  4. java反射机制--reflection

    反射,reflection,听其名就像照镜子一样,可以看见自己也可以看见别人的每一部分.在java语言中这是一个很重要的特性.下面是来自sun公司官网关于反射的介绍:    Reflection is ...

  5. JAVA的内省机制(introspector)与反射机制(reflection)

    http://yangzhibin-java.iteye.com/blog/452068 JAVA的内省机制(introspector)与反射机制(reflection) 博客分类: j2se Jav ...

  6. Java中反射机制(Reflection)学习

    Java语言的反射机制初步学习 首先看下基本概念: (一)在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任 意一个方法?答案是肯定的.这种动态获 ...

  7. Java反射机制(Reflection)

    反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...

  8. JAVA Reflection(反射机制)续

    接上一篇文章  JAVA Reflection(反射机制) 动态数组 java.lang.reflect.Array static Object set(Object array, int index ...

  9. JAVA Reflection(反射机制)

    Java 反射机制 反射机制简介 反射机制应用示例 简单的Ioc实现 代理模式 Java动态代理 简单的Aop实现 "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言" ...

最新文章

  1. 5G NR — 关键技术
  2. html src 图片不显示图片,css中不用src也让图片显示的方法是什么?
  3. ubuntu下安装jre的步骤
  4. Java 程序员必须掌握的 5 个注解
  5. 解决 sessionStroage 无法在多个标签页共享数据的问题
  6. 陶哲轩实分析定理11.9.1:微积分第一基本定理(二)
  7. React Native Fetch封装那点事...
  8. 说说vue-cli中使用flexible和px2rem-loader
  9. 【Energy Forecasting】能源预測的发展和展望
  10. CAN总线介绍及硬件设计
  11. AC-Campus准入控制--Mac
  12. 金山WPS暑期前端实习一面凉经
  13. SAP 采购订单关单
  14. JS---------------网页版的消灭星星
  15. ffmpeg利用滤镜合并两个视频,一左一右
  16. 一个项目配置多数据源Aop调用
  17. PDF如何进行免费合并?
  18. Motion Factory特效制作AE脚本五套 Particle/ActionFX/Glitch/TypeBuilder/Hi-Tech HUD
  19. 计算机术语csr是什么,CSR是什么意思 为何CSR越来越重要
  20. 名帖219 赵孟頫 行书《止斋记》

热门文章

  1. Go语言的错误异常处理机制及其应用
  2. 后端怎么防止重复提交?(常用的做法)
  3. 编写高性能Java代码的最佳实践
  4. etcd 笔记(04)— etcd 网关与 gRPC 网关
  5. 2022-2028年中国PE自粘性保护膜行业市场调查研究及发展前景展望报告
  6. docker 常用命令集合
  7. SpringCloud Alibaba微服务实战(六) - 路由网关(Gateway)
  8. 【微服务架构】SpringCloud之Feign
  9. ImportError: No module named tensorflow.compat.v1 忽略已经安装的某个包版本 忽略已安装版本...
  10. 我爱自然语言处理bert ner chinese