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

/** 用户接口 */ 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反射类获取类信息 * 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
PHP具有完整的反射API,可以对类、接口、函数、方法和扩展进行反向工程。反射API并提供方法取出函数、类和方法中的文档注释。本文将介绍使用PHP反射API获取类信息的方法,提供完整演示代码。 PHP 5提供了一个完整的反射API,可以对、接口、函数、方法和扩展进行反向工程 找到一个对象出发地和来源的一个过程,通俗来讲就是可以根据这个对象,知道它所属的,拥有哪些方法。 PHP <?php class person{ public $name; public $age; public $sex; public fu...
一、什么是反射?它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于、方法、属性、参数等的详细信息,包括注释。这种动态获取信息以及动态调用对象的方法的功能称为反射API反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。二、反射的用途 其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。 http://blog.csdn