Plugin Hook 设计与实现

Plugin 跟 Hook 有什么区别,我的理解是编译语言更多使用 Plugin 一词,而动态语言更喜欢使用 Hook 一次。它们的功能都是扩展当前应用软件的功能。改变软件内部的运行逻辑。Plugin 对于编译语言是非常重要的,而动态语言显得不那么重要,因为动态语言出现是为了互补编译语言本身存在缺陷而设计的。

本文接选自《Netkiller Architect 手札》

作者:netkiller

出处:http://www.netkiller.cn/architect/index.html

14.6. Plugin & Hook 设计与实现

插件系统分为:

插件管理平台

插件探测

插件注册

插件调用

插件注销

14.6.1. 插件管理平台

14.6.1. 插件管理平台

		<?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);
	}
}		

14.6.2. 接口定义

		<?php
interface iPlugin
{
	public function test();
}		

14.6.3. 插件

		<?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!!!';
	}
}		

14.6.4. 测试

		<?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();		

原文发布于微信公众号 - Netkiller(netkiller-ebook)

原文发表时间:2016-09-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Felix的技术分享

用Android Studio调试Framework层代码

2115
来自专栏史上最简单的Spring Cloud教程

Openresty最佳案例 | 第7篇: 模块开发、OpenResty连接Redis

Lua模块开发 在实际的开发过程中,不可能把所有的lua代码写在一个lua文件中,通常的做法将特定功能的放在一个lua文件中,即用lua模块开发。在lualib...

2547
来自专栏编程微刊

基于promise用于浏览器和node.js的http客户端的axios

axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征:

832
来自专栏禹都一只猫博客

flask的Blueprint,前后台蓝图注册

1434
来自专栏蓝天

WGet使用指南

wget是一个从网络上自动下载文件的自由工具。它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理.

561
来自专栏禹都一只猫博客

flask的Blueprint,前后台蓝图注册

53110
来自专栏沈唁志

如何加速WordPress网站

本指南提供了一个测试环境,用于说明优化WordPress的过程。环境有两个组成部分:

973
来自专栏乐沙弥的世界

Linux 6 下安装 tomcat 8

963
来自专栏xingoo, 一个梦想做发明家的程序员

PowerCMD——cmd的命令行工具

之前就想整理一下程序员经常使用的一些工具,最近有时间正好整理一下。 有句话叫做:“工欲善其事必先利其器”,而我就算是搜集工具组装成一个系列——善事利器,来记...

1907
来自专栏Java学习123

tomcat结合nginx使用小结

3137

扫码关注云+社区