加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

php反射类 ReflectionClass[转]

(2011-05-13 11:32:30)
标签:

杂谈

分类: 开发相关
看一段代码:
 
 
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 方法

上面的过程很熟悉吧。其实和调用对象的方法类似
只不过这里是反着来的,方法在前,对象在后

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有