本文實例講述了php反射類別reflectionclass用法。分享給大家參考,具體如下:
先來看一段程式碼:
/** * @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)); } }
上述程式碼是php反射類別的一個應用。
什麼是php反射類,顧名思義,可以理解為一個類別的映射。
舉個例子:
class fuc { //定义一个类 static function ec() { echo '我是一个类'; } } $class=new reflectionclass('fuc'); //建立 fuc这个类的反射类
至於$class 這反射類別裡有什麼東東,可以查看手冊,這裡不詳解了
$fuc=$class->newinstance(); //相当于实例化 fuc 类 $fuc->ec(); //执行 fuc 里的方法ec /*最后输出:我是一个类*/
其中還有一些更高級的用法
$ec=$class->getmethod('ec'); //获取fuc 类中的ec方法 $fuc=$class->newInstance(); //实例化 $ec->invoke($fuc); //执行ec 方法
上面的過程很熟悉吧。其實和呼叫物件的方法類似
只不過這裡是反著來的,方法在前,物件在後
補充:這裡推薦一款本站的php程式碼線上格式化工具,可以方便讀者對網路上壓縮的php格式化程式碼後進行閱讀,方便實用!
php程式碼線上格式化美化工具:
http://tools.jb51.net/code/phpformat
更多關於php相關內容有興趣的讀者可查看本站專題:《php數組(array)操作技巧大全 》、《php排序演算法摘要》、《 php常用遍歷演算法與技巧總結》、《php資料結構與演算法教學》、《php程式設計演算法總結》、《php數學運算技巧總結 a>》、《php正規表示式用法摘要》、《php運算與運算子用法總結》、《php字串(string)用法總結》及《php常見資料庫操作技巧總表》
希望本文所述對大家php程式設計有所幫助。