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:
<?php
require 'Ref.class.php';
require 'User.class.php';
echo '<pre>';
Ref::setClass('Vip');
Ref::getBase();
Ref::getProperties();
Ref::getMethods();
Ref::getInterfaces();
echo '</pre>';
?>
输出:
BASE INFO
class name: Vip
class path: /home/fdipzone/ref
class filename: User.class.php
PROPERTIES INFO
property name: user
property modifier: protected
property comments: 用户数据
METHODS INFO
method name: getvip
method modifier: public
method params num: 1
param name:id
method comments: 读取vip用户数据
method name: format
method modifier: private
method params num: 1
param name:data
method comments: 修饰数据
method name: add
method modifier: public
method params num: 1
param name:data
method comments: 新增用户
method name: get
method modifier: public
method params num: 1
param name:id
method comments: 读取用户数据
INTERFACES INFO
interface name: IUser