本文接选自《Netkiller Architect 手札》
作者:netkiller
出处:http://www.netkiller.cn/architect/index.html
插件系统分为:
插件管理平台
插件探测
插件注册
插件调用
插件注销
<?php
final class Plugin{
private $plugins = null;
private $directory = 'plugins';
private $path = null;
public function __construct(){
$this->path = $this->directory.'/';
}
public function autoload(){
$interfaces = scandir($this->directory);
unset($interfaces[0]);
unset($interfaces[1]);
foreach($interfaces as $interface)
{
//load all of the plugins
$file = $this->path . $interface;
if (@file_exists($file))
{
include_once($file);
$class = basename($interface, ".php");
if (class_exists($class))
{
$this->$class = new $class($this);
$vars = get_class_vars($class);
$entity['name'] = $vars['name'];
$entity['description'] = $vars['description'];
$entity['author'] = $vars['author'];
$entity['class'] = $class;
$entity['methods'] = get_class_methods($class);
$this->plugins[$class] = $entity;
}
}
}
}
public function load($plugin){
$file = $this->path . $plugin . '.php';
if (@file_exists($file))
{
include_once($file);
$class = $plugin;
if (class_exists($class))
{
$this->$class = new $class($this);
$vars = get_class_vars($class);
$entity['name'] = $vars['name'];
$entity['description'] = $vars['description'];
$entity['author'] = $vars['author'];
$entity['class'] = $class;
$entity['methods'] = get_class_methods($class);
$this->plugins[$class] = $entity;
}
}
}
public function show(){
print_r($this->plugins);
}
}
<?php
interface iPlugin
{
public function test();
}
<?php
final class demo implements iPlugin{
public static $author = 'Neo Chen<openunix@163.com>';
public static $name = 'Demo';
public static $description = 'Demo Simple';
public function __construct(){
}
public function test(){
echo 'Hello world!!!';
}
}
<?php
function __autoload($class_name) {
require_once('library/'.$class_name . '.php');
}
//include_once('library/Plugin.php');
$plugin = new Plugin();
echo '=============================';
$plugin->load('demo');
$plugin->demo->test();
echo '=============================';
$plugin->autoload();
$plugin->show();