WebjxCom提示:
PHP中插件机制的一种实现方案.  
  原理讲了一大堆
,下面看看我的实现方案:  
  插件经理PluginManager类:  
  <?  
  /**  
  *STBLOGPluginManagerClass  
  *  
  *插件机制的实现核心类  
  *    
*@packageSTBLOG    *@subpackageLibraries    *@categoryLibraries    *@authorSaturn    *@linkhttp://www.cnsaturn.com/    */  
  classPluginManager  
  {  
  /**  
  *监听已注册的插件  
  *    
*@accessprivate    *@vararray    */  
  private$_listeners=array();  
  /**  
  *构造函数  
  *    
*@accesspublic    *@returnvoid    */  
  publicfunction__construct()  
  {  
  #这里$plugin数组包含我们获取已经由用户激活的插件信息  
  #为演示方便
,我们假定$plugin中至少包含  
  #$plugin=array(  
  #'name'=>'插件名称',  
  #'directory'=>'插件安装目录'  
  #);  
  $plugins=get_active_plugins();#这个函数请自行实现  
  if($plugins)  
  {  
  foreach($pluginsas$plugin)  
  {//假定每个插件文件夹中包含一个actions.php文件,它是插件的具体实现  
  if(@file_exists(STPATH.'plugins/'.$plugin['directory'].'/actions.php'))  
  {  
  include_once(STPATH.'plugins/'.$plugin['directory'].'/actions.php');  
  $class=$plugin['name'].'_actions';  
  if(class_exists($class))  
  {  
  //初始化所有插件  
  new$class($this);  
  }  
  }  
  }  
  }  
  #此处做些日志记录方面的东西  
  }  
  /**  
  *注册需要监听的插件方法(钩子)  
  *    
*@paramstring$hook    *@paramobject$reference    *@paramstring$method    */  
  functionregister($hook,&$reference,$method)  
  {  
  //获取插件要实现的方法  
  $key=get_class($reference).'->'.$method;  
  //将插件的引用连同方法push进监听数组中  
  $this->_listeners[$hook][$key]=array(&$reference,$method);  
  #此处做些日志记录方面的东西  
  }  
  /**  
  *触发一个钩子  
  *    
*@paramstring$hook钩子的名称    
*@parammixed$data钩子的入参    
*@returnmixed    */  
  functiontrigger($hook,$data='')  
  {  
  $result='';  
  //查看要实现的钩子,是否在监听数组之中  
  if(isset($this->_listeners[$hook])&&is_array($this->_listeners[$hook])&&count($this->_listeners[$hook])>0)  
  {  
  //循环调用开始  
  foreach($this->_listeners[$hook]as$listener)  
  {  
  //取出插件对象的引用和方法  
  $class=&$listener[0];  
  $method=$listener[1];  
  if(method_exists($class,$method))  
  {  
  //动态调用插件的方法  
  $result.=$class->$method($data);  
  }  
  }  
  }  
  #此处做些日志记录方面的东西  
  return$result;  
  }  
  }  
  ?>  
  以上代码加上注释不超过100行,就完成了整个插件机制的核心
。需要再次说明的是,你必须将它设置成全局类,在所有需要用到插件的地方,优先加载
。用#注释的地方是你需要自行完成的部分,包括插件的获取和日志记录等等。