利用反射API设计PHP插件系统

Demo如下 

<?php 
/** 
* 我们通过反射api来实现一个php插件系统 
* @author yangjs 
* @date 2011-03-28 
*/ 
### start 插件内核编写 ### 
/** 
* 第一步 插件接口类(统一的使用接口,插件系统的核心) 
* 考虑到多类插件共存 不使用单例模式 
*/ 
class pluginsApi { 
    public $pluginsName='';//插件类
    public function __construct($name){ 
        $this->pluginsName=$name; 
    } 
    /** 
    * 获取插件内置函数返回值 
    *
    * @param unknown_type $name 
    * @return unknown 
    */ 
    public function pluginsMethod($name){ 
        if(empty($this->pluginsName)){ 
            return false; 
        } 
        $d = array();
        foreach ( $this->findPlugins($this->pluginsName) as $p){ 
            if($p->hasMethod($name)){ 
                $pMethod = $p->getMethod($name); 
                if($pMethod->isStatic()){
                    $items = $pMethod->invoke(null); 
                }else{ 
                    $pInstance = $p->newInstance(); 
                    $items = $pMethod->invoke($pInstance); 
                } 
                $d[]=$items; 
            }
        } 
        return $d; 
    } 
    /** 
    * 插件查找器 api反射的使用 
    * @param $name 插件名称 
    */ 
    private function findPlugins() { 
        $p = array(); 
        foreach (get_declared_classes() as $class){ 
            $reflectionClass = new ReflectionClass($class); 
            if($reflectionClass->implementsInterface($this->pluginsName)){ 
                $p[] = $reflectionClass; 
            }
        } 
        return $p; 
    }
    public function __destruct(){ 
        $this->pluginsName=null; 
    } 
} 
/** 
* 第二步 我们定义两个插件接口 内容很简单 只有一个获取插件名称的方法[可以更复杂] 
* 
*/ 
interface myplugin { 
    public function getName(); 
}
interface otherplugin { 
    public function sayhello(); 
} 
### end 插件内核编写 ###
### start 外部插件 ### 
/** 
* 第三步 我们来写外部插件 
*/ 
/** 
* 第一个工具:计算器 
* 可以存放在外部目录入/plugins/jsq.php中 再include
*/ 
class jsq implements myplugin { 
    //实现插件接口方法 获取插件名称 
    public function getName() { 
        return "计算器"; 
    } 
    public function getVersion() { 
        return "v0.1"; 
    } 
    public function getAuthor() { 
        return "yangjs"; 
    }
    public function getUpdateTime() { 
        return '20110328'; 
    }
} 
/** 
* 第二个工具:万年历
* 可以存放在外部目录 入/plugins/wnl.php中 
再include 
*/ 
class wnl implements myplugin { 
    //实现插件接口方法 获取插件名称 
    public function getName() { 
        return "万年历"; 
    }
    public function getVersion() { 
        return "v0.1.1"; 
    } 
    public function getAuthor() { 
        return "yangjs17"; 
    }
    public function getUpdateTime() { 
        return '20110329'; 
    } 
    public function getToday() { 
        return date('Ymd'); 
    } 
} 
/** 
* 第三个工具:另外一个插件 显示祝福语 
*/ 
class helloWorld implements otherplugin { 
    public function sayhello() { 
        return 'hello other plugin'; 
    } 
} 
### end 外部插件 ### 
### start 插件调用 ### 
//调用插件 myplugin 
$m=new pluginsApi('myplugin'); 
$o=new pluginsApi('otherplugin'); 
print_r($m->pluginsMethod('getToday')); 
print_r($m->pluginsMethod('getName')); 
print_r($o->pluginsMethod('sayhello')); 
/* 输出结果如下:
    Array ( [0] => 20110328 ) 
    Array ( [0] => 计算器 [1] => 万年历 ) 
    Array ( [0] => hello other plugin ) 
    */ 
    ### end 插件调用 ###

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值