初識反射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 代碼如下  
    <?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));  
            }  
    }  


 







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章