初识反射API

反射api是php内建的oop技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些oop扩展被称为反射,位于php源码/ext/reflection目录下。 可以使用反射api自省反射api本身(这可能就是反射最初的意思,自己“看”自己)
反射API的用处有以下:
           检查类,是类的不可或缺的测试工具。
            eg:
               $reflectionclass=new ReflectionClass('Person');
               Reflection::export($reflectionclass);
           根据命名规则创建一个调用模板类中方法的框架。

下面是反射API的部分类:
Reflection   ReflectionClass  ReflectionMethod  ReflectionProperty   ReflectionParameter  ReflectionFunction
ReflectionExtension   ReflectionException

:::::::::::引用实例::::::::::
 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 = new computeMenu();  
    $articles  = new computeArticles();  
    print_r($menu);  
    print_r($articles);  
      
      
    //plugin.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));  
            }  
    }  


 







你可能感兴趣的:(反射API,反射API,php,测试工具,oop)