PHP反射API

來源:互聯網
上載者:User

標籤:

<?php/** * @name    PHP反射API--利用反射技術實現的外掛程式系統架構 *//** * 先調用findPlugins方法擷取到擷取到實現了介面的類 * 然後調用反射類的方法 * @param $method   方法名 * @param $interfaceName   介面名 * @return array    方法名對應的返回結果 */function compute($method,$interfaceName){    $findPlugins = findPlugins($interfaceName);    $menu = array();    foreach ($findPlugins as $plugin){     //這裡擷取到實現Iplugin介面的所有的類        if ($plugin->hasMethod($method)) {       //檢查在類中特定的方法是否被定義。            $reflectionMethod = $plugin->getMethod($method);     //擷取類中的方法            if ($reflectionMethod->isStatic()) {        //判斷其方法是否為靜態方法                $items = $reflectionMethod->invoke(null);            } else {                $pluginInstance = $plugin->newInstance();   //建立類的新執行個體。給定參數傳遞給類建構函式。                $items = $reflectionMethod->invoke($pluginInstance);            }            $menu = array_merge($menu, is_array($items)?$items:[$items]);        }    }    return $menu;}/** * 首先從一堆已定義的類中找到實現Iplugin介面的類 * 然後將其存放在數組中 return * @param  string           $interfaceName * @return array            $plugins */function findPlugins($interfaceName){    $plugins = array();    //返回由已定義類的名字所組成的數組    foreach (get_declared_classes() as $class){        $reflectionClass = new ReflectionClass($class);//獲得class的反射對象,包括私人的屬性方法        if ($reflectionClass->implementsInterface($interfaceName)) {     //檢查它是否實現了Iplugin介面            $plugins[] = $reflectionClass;      //找到需要反射的類        }    }    return $plugins;}interface Iplugin{    public static function getName();   //定義介面和靜態方法}//實現Iplugin介面class MycoolPugin implements Iplugin {    public static function getName(){        return ‘MycoolPlugin‘;    }    public 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‘ ));    }}$menu = compute(‘getMenuItems‘,‘Iplugin‘);$articles    = compute(‘getArticles‘,‘Iplugin‘);print_r($menu);echo "<hr>";print_r($articles);echo "<hr>";$name = compute(‘getName‘,‘Iplugin‘);print_r($name);/*    new class和new ReflectionClass的區別是什麼    1、new $class() 執行個體化class對象    2、new ReflectionClass($class) 獲得class的反射對象(包含了中繼資料資訊)    區別:    1、new出來的class,你不能訪問他的私人屬性/方法,但反射可以。    2、反射返回的對象是class的中繼資料對象(包含class的所有屬性/方法的中繼資料資訊),但不是類本身;類似於查到了類的戶口檔案,但戶口檔案不是人!*/
實現原理:        先調用get_declared_classes()返回已被定義的類,        然後調用implementsInterface(Stringa $str)方法擷取到實現需要擷取介面的類名,        然後調用其方法(public,static public)

PHP反射API

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.