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 插件调用 ###