php 利用反射API获取类信息

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
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值