php 利用反射API获取类信息
来源:互联网 发布:云计算项目实施方案 编辑:程序博客网 时间:2024/06/05 08:47
PHP具有完整的反射API,可以对类、接口、函数、方法和扩展进行反向工程。反射API并提供方法取出函数、类和方法中的文档注释。本文将介绍使用PHP反射API获取类信息的方法,提供完整演示代码。
PHP反射API文档地址:http://php.net/manual/zh/class.reflectionclass.php
使用ReflectionClass获取类的属性,接口,方法等信息
1.获取类基本信息
$ref = new ReflectionClass($classname);echo $ref->getName();echo $ref->getFileName();
2.获取类属性信息
$ref = new ReflectionClass($classname);$properties = $ref->getProperties();foreach($properties as $property){ echo $property->getName();}
3.获取类方法信息
$ref = new ReflectionClass($classname);$methods = $ref->getMethods();foreach($methods as $method){ echo $method->getName();}
4.获取类接口信息
$ref = new ReflectionClass($classname);$interfaces = $ref->getInterfaces();foreach($interfaces as $interface){ echo $interface->getName();}
演示代码
创建IUser接口,User类,Vip类用于被读取
User.class.php
<?php/** 用户接口 */interface IUser{ // 新增用户 public function add($data); // 读取用户数据 public function get($id);}/** 用户类 */class User implements IUser{ /** * 用户数据 */ protected $user = array(); /** * 新增用户 * @param Array $data 用户数据 * @return Int */ public function add($data){ $this->user[] = $data; $keys = array_keys($this->user); return end($keys); } /** * 读取用户数据 * @param Int $id 用户id * @return Array */ public function get($id){ if(isset($this->user[$id])){ return $this->user[$id]; }else{ return array(); } }}/** VIP用户类 */class Vip extends User{ /** * 读取vip用户数据 * @param Int $id 用户id * @return Array */ public function getvip($id){ $data = $this->get($id); if($data){ return $this->format($data); } return $data; } /** * 修饰数据 * @param Array $data 用户数据 * @return Array */ private function format($data){ $data['is_vip'] = 1; return $data; }}?>
创建Ref类调用PHP反射类获取类信息
Ref.class.php
<?php/** * 调用PHP反射类获取类信息 * Date: 2017-05-24 * Author: fdipzone * Ver: 1.0 * * Func * public static setClass 设置反射类 * public static getBase 读取类基本信息 * public static getInterfaces 读取类接口 * public static getProperties 读取类属性 * public static getMethods 读取类方法 */class Ref{ private static $refclass = null; // 设置反射类 public static function setClass($classname){ self::$refclass = new ReflectionClass($classname); } // 读取类基本信息 public static function getBase(){ echo '<strong>BASE INFO</strong>'.PHP_EOL; echo 'class name: '.self::$refclass->getName().PHP_EOL; echo 'class path: '.dirname(self::$refclass->getFileName()).PHP_EOL; echo 'class filename: '.basename(self::$refclass->getFileName()).PHP_EOL.PHP_EOL; } // 读取类接口 public static function getInterfaces(){ echo '<strong>INTERFACES INFO</strong>'.PHP_EOL; $interfaces = self::$refclass->getInterfaces(); if($interfaces){ foreach($interfaces as $interface){ echo 'interface name: '.$interface->getName().PHP_EOL; } } } // 读取类属性 public static function getProperties(){ echo '<strong>PROPERTIES INFO</strong>'.PHP_EOL; $properties = self::$refclass->getProperties(); if($properties){ foreach($properties as $property){ echo 'property name: '.$property->getName().PHP_EOL; echo 'property modifier: '.self::getModifier($property).PHP_EOL; echo 'property comments: '.self::formatComment($property->getDocComment()).PHP_EOL.PHP_EOL; } } } // 读取类方法 public static function getMethods(){ echo '<strong>METHODS INFO</strong>'.PHP_EOL; $methods = self::$refclass->getMethods(); if($methods){ foreach($methods as $method){ echo 'method name: '.$method->getName().PHP_EOL; echo 'method modifier: '.self::getModifier($method).PHP_EOL; echo 'method params num: '.$method->getNumberOfParameters().PHP_EOL; $params = $method->getParameters(); if($params){ foreach($params as $param){ echo 'param name:'.$param->getName().PHP_EOL; } } echo 'method comments: '.self::formatComment($method->getDocComment()).PHP_EOL.PHP_EOL; } } } // 获取修饰符 private static function getModifier($o){ // public if($o->isPublic()){ return 'public'; } // protected if($o->isProtected()){ return 'protected'; } // private if($o->isPrivate()){ return 'private'; } return ''; } // 格式化注释内容 private static function formatComment($comment){ $doc = explode(PHP_EOL, $comment); return isset($doc[1])? trim(str_replace('*','',$doc[1])) : ''; }}?>
demo:
<?phprequire 'Ref.class.php';require 'User.class.php';echo '<pre>';Ref::setClass('Vip');Ref::getBase();Ref::getProperties();Ref::getMethods();Ref::getInterfaces();echo '</pre>';?>
输出:
BASE INFOclass name: Vipclass path: /home/fdipzone/refclass filename: User.class.phpPROPERTIES INFOproperty name: userproperty modifier: protectedproperty comments: 用户数据METHODS INFOmethod name: getvipmethod modifier: publicmethod params num: 1param name:idmethod comments: 读取vip用户数据method name: formatmethod modifier: privatemethod params num: 1param name:datamethod comments: 修饰数据method name: addmethod modifier: publicmethod params num: 1param name:datamethod comments: 新增用户method name: getmethod modifier: publicmethod params num: 1param name:idmethod comments: 读取用户数据INTERFACES INFOinterface name: IUser
阅读全文
1 0
- php 利用反射API获取类信息
- Java基础-利用反射获取类信息
- ORM尝试二 利用反射获取类信息
- 利用java反射机制获取一个类中信息
- Android获取设备信息(利用反射)
- Android利用反射获取WLAN热点信息
- 利用反射API设计PHP插件系统
- php 用反射API来获取一个类的原型
- c#反射机制学习和利用反射获取类型信息
- 利用php反射机制 获取权限
- 利用API函数获取系统信息
- Java反射获取类信息
- java反射获取类信息
- 利用“PHP彩蛋”进行敏感信息获取
- 地区经纬度信息获取(利用Google地图API获取)
- 地区经纬度信息获取(利用Google地图API获取)
- 96利用反射获取缓存和应用程序的大小信息
- 根据包名利用反射获取缓存信息
- Python开发初探
- Java web项目的解耦合
- MapReduce自定义二次排序
- DOM类
- hexo的next主题个性化教程:打造炫酷网站
- php 利用反射API获取类信息
- Trie树(字典树)
- JavaScript
- redis 命令
- 虚拟机Linux配置桥接模式
- 最佳刷题 想法
- 数据结构—2213: 链表的拆分(线性表)
- Java中的Filter过滤器
- instanceof运算符