Plugin Hook 设计与实现
时间:2022-05-03
本文章向大家介绍Plugin Hook 设计与实现,主要内容包括Plugin 跟 Hook 有什么区别,我的理解是编译语言更多使用 Plugin 一词,而动态语言更喜欢使用 Hook 一次。它们的功能都是扩展当前应用软件的功能。改变软件内部的运行逻辑。Plugin 对于编译语言是非常重要的,而动态语言显得不那么重要,因为动态语言出现是为了互补编译语言本身存在缺陷而设计的。、14.6. Plugin & Hook 设计与实现、14.6.1. 插件管理平台、14.6.2. 接口定义、14.6.3. 插件、14.6.4. 测试、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
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();
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 分布式一致性协议 - Paxos
- 链表中穿针引线
- Android 帧动画的实例详解
- Android HandlerThread使用方法详解
- LeetCode 167,两数之和2
- 详解android 通过uri获取bitmap图片并压缩
- android线程消息机制之Handler详解
- 分布式一致性协议 - ZAB
- 删除链表的倒数第N个节点
- Open3d学习计划—高级篇 2(彩色点云配准)
- Android7.0上某些PopuWindow出现显示位置不正确问题的解决方法
- 有效的括号
- Android PopupWindow实现左侧弹窗效果
- LeetCode. 209. 长度最小的子数组
- 一篇文章就能了解Rxjava