PHP反射

PHP 5 具有完整的反射 API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。 此外,反射 API 提供了方法来取出函数、类和方法中的文档注释。


反射是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。
其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。

LINK_1
LINK_2
LINK_3

<?php
class Apple {
    public function firstMethod() { echo 'first'; }
    final protected function secondMethod() { }
    private static function thirdMethod() { }
}
//定义了一个反射类
$clsw = new ReflectionClass('Apple');
//创建一个实例
$cls = $clsw->newInstance();
//获取反射的类方法
$methods = $clsw->getMethod('firstMethod');
//调用方法
$methods->invoke($cls);
<?php

class A
{
    public $one = '';
    public $two = '';

    //Constructor
    public function __construct()
    {
        //Constructor
    }

    //print variable one
    public function echoOne()
    {
        echo $this->one."\n";
    }

    //print variable two    
    public function echoTwo()
    {
        echo $this->two."\n";
    }
}

//Instantiate the object
$a = new A();

//实例化一个反射类
$reflector = new ReflectionClass('A');

//获得属性
$properties = $reflector->getProperties();

$i =1;
//Now go through the $properties array and populate each property
foreach($properties as $property)
{
    //$a->one = 1;
    $a->{$property->getName()}=$i;
    //$a->echoOne();
    $a->{"echo".ucfirst($property->getName())}()."\n";

    $i++;
}
//输出 1,2
?>
<?php
interface IPlugin
{
    public static function getName();
}

class Plugin implements IPlugin
{
    public static function getName()
    {
        return 'Plugin';
    }

    public static function getItems()
    {
        return array(
            array(
                'title'=>'reflection'
            )
        );
    }
}

function findPlugins()
{
    $plugins = array();
    foreach(get_declared_classes() as $class){
        $reflectionClass = new ReflectionClass($class);
        if($reflectionClass->implementsInterface('IPlugin')){
            $plugins[] = $reflectionClass;
        }
    }
    return $plugins;
}

function Items()
{
    $items = array();
    foreach(findPlugins() as $plugin){
        if($plugin->hasMethod('getItems')){
            $reflectionMethod = $plugin->getMethod('getItems');
            if($reflectionMethod->isStatic()){
                $item = $reflectionMethod->invoke(null);
            }else{
                $pluginInstance = $plugin->newInstance();
                $item = $pluginInstance->invoke();
            }
        }
        $items = array_merge($items, $item);
    }
    return $items;
}

$item = Items();
print_r($item);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值