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 条评论
登录 后参与评论

相关文章

来自专栏DeveWork

免插件仅代码实现IE6浏览器升级提示(两例样式)

对许多前端工程师来说,如果他们足够在意的话,IE6是经常折磨他们的痛。在当前环境下,昔日的浏览器王者IE6正日渐黄昏,微软也将在2014年彻底不支持IE6,还上...

1775
来自专栏前端小作坊

CSS vs JS动画:谁更快?

Javascript 动画怎么可能总是和 CSS transition 一样快,甚至更快呢?到底是什么秘密呢?Adobe 和 Google 是怎么做到让他们的富...

832
来自专栏林德熙的博客

CSDN 阅读 源代码 ListView宽度过小获取博客

我们写软件,一般是用用一个页面来做导航,这个页面就是一个Frame,然后包含各种导航,所以这个页面会一直存在我们的内存。

371
来自专栏CNN

理清Activity、View及Window之间关系

转载请注明出处:【huachao1001的专栏:http://blog.csdn.net/huachao1001】

772
来自专栏HTML5学堂

移动端开发-iPhone、iPad的默认按钮样式等开发经验

HTML5学堂:从JS的逻辑层来说,移动端远远不如PC平台,但是“恐怖的”兼容问题是移动端最为头疼的地方。本文介绍iPad与iPhone的默认按钮样式的处理方法...

2615
来自专栏大数据钻研

学习HTML的笔记

不知不觉我已经踏上了这条程序猿的不归路,从最基础的HTML标签开始学习,道阻且艰。谨用简书来记录这些 即使敌众我寡,末将亦能万军丛中取敌将首级! 框架 公司开发...

2679
来自专栏互联网杂技

AngularJS 对SEO是硬伤

在过去的2014年, 前端开发因为大量前端框架的出现开发模式有了巨大的改变,MVC这个web服务器端开发的模式,由于angularjs们的出现,变成了前端MVV...

3797
来自专栏web前端教室

本周先行者课程--多级下拉菜单回顾

各位同学们大家好,又到周末了。这个周末咱们开始讲新的前端组件,多级下拉菜单。这个东西我们以前讲过一次,但因为感觉之前讲的有些不太充分,还是把它再拿出来讲一下。 ...

1858
来自专栏Grace development

[还魂篇] 初来乍到如何致人于死地

初来乍到如何致人于死地,这个标题起的有点血腥恐怖了,代码写不好,吃饭吃不好。本章我们一起来回忆下那些年的“烂代码”,整理不全请见谅,以下都是我写过的?

402
来自专栏ionic3+

【风雨欲来的Hybird】(2)Stencil——万物皆组件,与框架无关

Stencil也不是一个新东西,出来快有10个月了,它中文意思是“模版”,是一个Web组件的编译器,它采用微小的虚拟DOM层、有效的单向数据绑定、异步渲染管道(...

772

扫描关注云+社区