php 反射API

简述

反射API 是php内置的OOP扩展之一,包含一系列的类、接口和异常。 它允许访问程序的元数据并与相关联的代码注释打交道。 所以,可以使用它对其他的类、接口、方法、属性、函数和扩展进行分析。在php源码的 /ext/reflection 包中可以找到它。


使用方法

通过以下代码,了解 API 的基本使用方法
<?
interface ITest{
    static function fTest(mixed $str);
}


class Test implements  ITest{
    static  function fTest(mixed $str){
        echo "testing";
    }
}

//要分析一个类,首先要创建类的反射对象
$rfClass = new ReflectionClass("Test");
 
//通过反射对象提供的方法,分析类是否为自定义
if(!$rfClass->isUserDefined()) die("error");

//通过反射对象提供的方法,分析类是实现了指定的接口
if(!$rfClass->implementsInterface("ITest")) die("error");

//通过反射对象提供的方法,分析类是否包含指定的方法
if(!$rfClass->hasMethod("fTest")) die("error");

//取得方法的反射对象
$rfM = $rfClass->getMethod("fTest"); 

//判断方法是否为静态
if($rfM->isStatic()){
    $rfM->invoke(); //调用静态方法
}
else{
    $instance = $rfClass-><span><span>newInstance</span></span>(null); //取得类的对象
    $rfM->invoke($instance);//调用方法
}
?>

通过以下脚本,可以列出反射API所有的类、方法和参数。

<php
    Reflection::export(new ReflectionExtension("reflection"));
>


API概览

class Reflection { }
interface Reflector { }
class ReflectionException extends Exception { }
class ReflectionFunction implements Reflector { }
class ReflectionParameter implements Reflector { }
class ReflectionMethod extends ReflectionFunction { }
class ReflectionClass implements Reflector { }
class ReflectionObject extends ReflectionClass { }
class ReflectionProperty implements Reflector { }
class ReflectionExtension implements Reflector { }


详细说明

例子详见php手册

①Reflection类

<?php
class Reflection
{
    public static mixed export(Reflector r [,bool return])
    //导出一个类或方法的详细信息
    public static array getModifierNames(int modifiers)
    //取得修饰符的名字
}
?>

②ReflectionException类


该类继承标准类,没特殊方法和属性。


③ReflectionFunction类

<?php
class ReflectionFunction implements Reflector
{
    final private __clone()
    public object __construct(string name)
    public string __toString()
    public static string export()
    //导出该函数的详细信息
    public string getName()
    //取得函数名
    public bool isInternal()
    //测试是否为系统内部函数
    public bool isUserDefined()
    //测试是否为用户自定义函数
    public string getFileName()
    //取得文件名,包括路径名
    public int getStartLine()
    //取得定义函数的起始行
    public int getEndLine()
    //取得定义函数的结束行
    public string getDocComment()
    //取得函数的注释
    public array getStaticVariables()
    //取得静态变量
    public mixed invoke(mixed* args)
    //调用该函数,通过参数列表传参数
    public mixed invokeArgs(array args)
    //调用该函数,通过数组传参数
    public bool returnsReference()
    //测试该函数是否返回引用
    public ReflectionParameter[] getParameters()
    //取得该方法所需的参数,返回值为对象数组
    public int getNumberOfParameters()
    //取得该方法所需的参数个数
    public int getNumberOfRequiredParameters()
    //取得该方法所需的参数个数
}
?>

④ReflectionParameter类:

<?php
class ReflectionParameter implements Reflector
{
    final private __clone()
    public object __construct(string name)
    public string __toString()
    public static string export()
    //导出该参数的详细信息
    public string getName()
    //取得参数名
    public bool isPassedByReference()
    //测试该参数是否通过引用传递参数
    public ReflectionClass getClass()
    //若该参数为对象,返回该对象的类名
    public bool isArray()
    //测试该参数是否为数组类型
    public bool allowsNull()
    //测试该参数是否允许为空
    public bool isOptional()
    //测试该参数是否为可选的,当有默认参数时可选
    public bool isDefaultValueAvailable()
    //测试该参数是否为默认参数
    public mixed getDefaultValue()
    //取得该参数的默认值
}
?>

⑤ReflectionClass类:

<?php
class ReflectionClass implements Reflector
{
    final private __clone()
    public object __construct(string name)
    public string __toString()
    public static string export()
    //导出该类的详细信息
    public string getName()
    //取得类名或接口名
    public bool isInternal()
    //测试该类是否为系统内部类
    public bool isUserDefined()
    //测试该类是否为用户自定义类
    public bool isInstantiable()
    //测试该类是否被实例化过
    public bool hasConstant(string name)
    //测试该类是否有特定的常量
    public bool hasMethod(string name)
    //测试该类是否有特定的方法
    public bool hasProperty(string name)
    //测试该类是否有特定的属性
    public string getFileName()
    //取得定义该类的文件名,包括路径名
    public int getStartLine()
    //取得定义该类的开始行
    public int getEndLine()
    //取得定义该类的结束行
    public string getDocComment()
    //取得该类的注释
    public ReflectionMethod getConstructor()
    //取得该类的构造函数信息
    public ReflectionMethod getMethod(string name)
    //取得该类的某个特定的方法信息
    public ReflectionMethod[] getMethods()
    //取得该类的所有的方法信息
    public ReflectionProperty getProperty(string name)
    //取得某个特定的属性信息
    public ReflectionProperty[] getProperties()
    //取得该类的所有属性信息
    public array getConstants()
    //取得该类所有常量信息
    public mixed getConstant(string name)
    //取得该类特定常量信息
    public ReflectionClass[] getInterfaces()
    //取得接口类信息
    public bool isInterface()
    //测试该类是否为接口
    public bool isAbstract()
    //测试该类是否为抽象类
    public bool isFinal()
    //测试该类是否声明为final
    public int getModifiers()
    //取得该类的修饰符,返回值类型可能是个资源类型
    //通过Reflection::getModifierNames($class->getModifiers())进一步读取
    public bool isInstance(stdclass object)
    //测试传入的对象是否为该类的一个实例
    public stdclass newInstance(mixed* args)
    //创建该类实例
    public ReflectionClass getParentClass()
    //取得父类
    public bool isSubclassOf(ReflectionClass class)
    //测试传入的类是否为该类的父类
    public array getStaticProperties()
    //取得该类的所有静态属性
    public mixed getStaticPropertyValue(string name [, mixed default])
    //取得该类的静态属性值,若private,则不可访问
    public void setStaticPropertyValue(string name, mixed value)
    //设置该类的静态属性值,若private,则不可访问,有悖封装原则
    public array getDefaultProperties()
    //取得该类的属性信息,不含静态属性
    public bool isIterateable()
    public bool implementsInterface(string name)
    //测试是否实现了某个特定接口
    public ReflectionExtension getExtension()
    public string getExtensionName()
}
?>

⑥ReflectionMethod类

<?php
class ReflectionMethod extends ReflectionFunction
{
    public __construct(mixed class, string name)
    public string __toString()
    public static string export()
    //导出该方法的信息
    public mixed invoke(stdclass object, mixed* args)
    //调用该方法
    public mixed invokeArgs(stdclass object, array args)
    //调用该方法,传多参数
    public bool isFinal()
    //测试该方法是否为final
    public bool isAbstract()
    //测试该方法是否为abstract
    public bool isPublic()
    //测试该方法是否为public
    public bool isPrivate()
    //测试该方法是否为private
    public bool isProtected()
    //测试该方法是否为protected
    public bool isStatic()
    //测试该方法是否为static
    public bool isConstructor()
    //测试该方法是否为构造函数
    public bool isDestructor()
    //测试该方法是否为析构函数
    public int getModifiers()
    //取得该方法的修饰符
    public ReflectionClass getDeclaringClass()
    //取得该方法所属的类
    // Inherited from ReflectionFunction
    final private __clone()
    public string getName()
    public bool isInternal()
    public bool isUserDefined()
    public string getFileName()
    public int getStartLine()
    public int getEndLine()
    public string getDocComment()
    public array getStaticVariables()
    public bool returnsReference()
    public ReflectionParameter[] getParameters()
    public int getNumberOfParameters()
    public int getNumberOfRequiredParameters()
}
?>

⑦ReflectionProperty类:

<?php
class ReflectionProperty implements Reflector
{
    final private __clone()
    public __construct(mixed class, string name)
    public string __toString()
    public static string export()
    //导出该属性的详细信息
    public string getName()
    //取得该属性名
    public bool isPublic()
    //测试该属性名是否为public
    public bool isPrivate()
    //测试该属性名是否为private
    public bool isProtected()
    //测试该属性名是否为protected
    public bool isStatic()
    //测试该属性名是否为static
    public bool isDefault()
    public int getModifiers()
    //取得修饰符
    public mixed getValue(stdclass object)
    //取得该属性值
    public void setValue(stdclass object, mixed value)
    //设置该属性值
    public ReflectionClass getDeclaringClass()
    //取得定义该属性的类
    public string getDocComment()
    //取得该属性的注释
}
?>

⑧ReflectionExtension类

<?php
class ReflectionExtension implements Reflector {
    final private __clone()
    public __construct(string name)
    public string __toString()

    public static string export()
    //导出该扩展的所有信息
    public string getName()
    //取得该扩展的名字
    public string getVersion()
    //取得该扩展的版本
    public ReflectionFunction[] getFunctions()
    //取得该扩展的所有函数
    public array getConstants()
    //取得该扩展的所有常量
    public array getINIEntries()
    //取得与该扩展相关的,在php.ini中的指令信息
    public ReflectionClass[] getClasses()
    public array getClassNames()
}
?>


PHP反射API--利用反射技术实现的插件系统架构

<?php

/**
* @name    PHP反射API--利用反射技术实现的插件系统架构
* @author :PHPCQ.COM
*/
interface Iplugin {
    public static function getName();
}
function findPlugins() {
    $plugins = array ();
    foreach ( get_declared_classes () as $class ) {
        $reflectionClass = new ReflectionClass ( $class );
        if ($reflectionClass->implementsInterface ( 'Iplugin' )) {
            $plugins [] = $reflectionClass;
        }
    }
    return $plugins;
}
function computeMenu() {
    $menu = array ();
    foreach ( findPlugins () as $plugin ) {
        if ($plugin->hasMethod ( 'getMenuItems' )) {
            $reflectionMethod = $plugin->getMethod ( 'getMenuItems' );
            if ($reflectionMethod->isStatic ()) {
                $items = $reflectionMethod->invoke ( null );
            } else {
                $pluginInstance = $plugin->newInstance ();
                $items = $reflectionMethod->invoke ( $pluginInstance );
            }
            $menu = array_merge ( $menu, $items );
        }
    }
    return $menu;
}
function computeArticles() {
    $articles = array ();
    foreach ( findPlugins () as $plugin ) {
        if ($plugin->hasMethod ( 'getArticles' )) {
            $reflectionMethod = $plugin->getMethod ( 'getArticles' );
            if ($reflectionMethod->isStatic ()) {
                $items = $reflectionMethod->invoke ( null );
            } else {
                $pluginInstance = $plugin->newInstance ();
                $items = $reflectionMethod->invoke ( $pluginInstance );
            }
            $articles = array_merge ( $articles, $items );
        }
    }
    return $articles;
}
require_once ('plugin.php');
$menu = computeMenu ();
$articles = computeArticles ();
print_r ( $menu );
print_r ( $articles );
?>    

plugin.php 代码如下

<?php
class MycoolPugin implements Iplugin {
	public static function getName() {
		return 'MycoolPlugin';
	}
	public static function getMenuItems() {
		return array (
				array (
						'description' => 'MycoolPlugin',
						'link' => '/MyCoolPlugin' 
				) 
		);
	}
	public static function getArticles() {
		return array (
				array (
						'path' => '/MycoolPlugin',
						'title' => 'This is a really cool article',
						'text' => xxxxxxxxx 
				) 
		);
	}
}
?>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值