我们先来回顾下原本的开发流程; 产品汪搞出了一堆需求; 当用户注册成功后需要发送短信、发送邮件等等; 然后聪明机智勇敢的程序猿们就一扑而上; 把这些需求转换成代码扔在 用户注册成功 和 跳转到首页 之间;

没有什么能够阻挡;充满创造力的猿们;

<?php
class Test{public function index(){// 用户注册成功/*此处是一堆发送短信的代码*//*此处是一堆发送邮件的代码*//*此处是一堆其他功能的代码*/// 前往网站首页}
}
$test=new Test();
$test->index();
复制代码

如果每个功能都由不同的猿完成的话; 首先面临的就是代码会很杂乱;配合起来会比较麻烦; 那封装成函数吧;一方面会规范整洁写;另外方便重复调用;

没有什么能够阻挡;充满创造力的猿们;

<?php
class Test{public function index(){// 用户注册成功// 发送短信sendSms($phone);// 发送邮件sendSms($email);// 其他操作...// 前往网站首页}
}
/*** 发送短信通知* @param  integer $phone 手机号*/
function sendSMS($phone){// 此处是发送短信的代码
}
/*** 发送邮件通知* @param  string $email 邮箱地址*/
function sendEmail($email){// 此处是发送邮件的代码
}
复制代码

这时候运营喵表示; 如果能在后台点点按钮就能设置是发邮件还是发短信;那想必是极好的;

没有什么能够阻挡;充满创造力的猿们;

<?php
class Test{public function index(){// 用户注册成功if ('如果设置了发送短信') {// 发送短信sendSms($phone);}if ('如果设置了发送邮件') {// 发送邮件sendSms($email);}// 其他操作...// 前往网站首页}
}
/*** 发送短信通知* @param  integer $phone 手机号*/
function sendSMS($phone){// 此处是发送短信的代码
}
/*** 发送邮件通知* @param  string $email 邮箱地址*/
function sendEmail($email){// 此处是发送邮件的代码
}
复制代码

在一个封闭企业环境下这样搞是没有问题的; 然鹅;我们还有一位开放无私的猿领导要把程序开源出去造福其他猿类; 希望有更多的猿类来参与这个项目;共同开发功能; 如果大家都去改动这套程序;把自己的代码扔在 用户注册成功 和 跳转到首页 之间; 这显然是不靠谱的;想想都混乱的一塌糊涂;

那可不可以大家把自己写的代码放到某个目录下; 然后系统自动的根据配置项把这些代码加载到 用户注册成功 和 跳转到首页 之间呢? 好先定义如下目录

├─plugin // 插件目录
│  ├─plugin1 // 插件1
│  │  ├─config.php // 插件1的配置项
│  │  ├─index.php // 插件1的程序处理内容
│  ├─plugin2
│  │  ├─config.php
│  │  ├─index.php
│  ├─plugin3
│  │  ├─config.php
│  │  ├─index.php
│  ├─...
├─index.php // 业务逻辑
复制代码

业务逻辑的代码:

<?php
class Test{public function index(){// 用户注册成功// 获取全部插件$pluginList=scandir('./plugin/');// 循环插件 // 排除. ..foreach ($pluginList as $k => $v) {if ($v=='.' || $v=='..') {unset($pluginList[$k]);}}echo "简易后台管理<hr>";// 插件管理foreach ($pluginList as $k => $v) {// 获取配置项$config=include './plugin/'.$v.'/config.php';$word=$config['status']==1 ? '点击关闭' : '点击开启';echo $config['title'].'<a href="./index.php?change='.$v.'">'.$word.'</a><br />';}echo '<hr>';// 输出插件内容foreach ($pluginList as $k => $v) {// 获取配置项$config=include './plugin/'.$v.'/config.php';if ($config['status']==1) {include './plugin/'.$v.'/index.php';// 运行插件Hook::run($v);}}// 前往网站首页}
}
// 插件类
class Hook{// 注册添加插件public static function add($name,$func){$GLOBALS['hookList'][$name][]=$func;}// 执行插件public static function run($name,$params=null){foreach ($GLOBALS['hookList'][$name] as $k => $v) {call_user_func($v,$params);}}
}
// 更改插件状态
if (isset($_GET['change'])) {// 获取到配置项$config=include './plugin/plugin'.substr($_GET['change'],-1).'/config.php';// 如果是开启 那就关闭 如果是关闭 则开启$config['status']=$config['status']==1 ? 0: 1;// 将更改后的配置项写入到文件中$str="<?php \\r\\n return ".var_export($config,true).';';file_put_contents('./plugin/'.$_GET['change'].'/config.php', $str);header('Location:./');
}
$test=new Test();
$test->index();
复制代码

插件配置项代码:

<?phpreturn array ('status' => 1, // 定义状态 1表示开启  0表示关闭'title' => '发送短信', // 插件的名称
);
复制代码

插件的内容:

<?phpHook::add('plugin1',function(){echo '发送短信的内容<br />';
});
复制代码

demo源代码:传送门 demo的在线演示:传送门

没错;这就是插件的思想; 当然这只是一个超级简单的示例; 完整的插件机制要包括插件的类型、数据库、审核等等; 如果使用过wordpress或者国内的discuz; 你就会发现一个好的程序并不仅仅是自身多么优秀; 而且重要的就是设计的扩展性有多好;能多方便的让大家去扩展它的功能; 想对插件深入研究的话;建议去阅读wordpress、discuz的源代码;

白俊遥博客

原文:白俊遥博客https://baijunyao.com

转载于:https://juejin.im/post/5aa77049f265da237410a54b

php中钩子(hook)的应用示例demo相关推荐

  1. wince中的hook(钩子)用法

    wince中的hook(钩子)用法 Hook(钩子)是一种在消息到达目标窗口前进行截获的技术.使用钩子主要使用以下三个函数SetWindowsHookEx:创建钩子 CallNextHookEx:将消 ...

  2. mfc中嵌入python_Python 中的 Hook 钩子函数

    1. 什么是Hook 经常会听到钩子函数(hook function)这个概念,最近在看目标检测开源框架mmdetection,里面也出现大量Hook的编程方式,那到底什么是hook?hook的作用是 ...

  3. C#中的Hook,即钩子,引用微软的文章,很有用的

    最近打DOTA,用魔兽修改键,突然想了想,修改键怎么用C#代码编写出来的,经过百度后,知道了需要用钩子(Hook),最后在百度的帮助下,正在努力写属于我自己的魔兽修改键.此篇从微软官方借了一些Hook ...

  4. php钩子函数示例,PHP中钩子函数的实现与认识

    假如有这么一段程序: function fun(){ fun1(); fun2(); } 首先程序执行完fun1()之后执行fun2()然后fun()结束. 但是,假如我们想对函数做一些变化.比如说, ...

  5. java hook全局钩子_钩子(hook)

    钩子(hook)编程 一.钩子介绍 1.1钩子的实现机制 钩子英文名叫Hook,是一种截获windows系统中某应用程序或者所有进程的消息的一种技术.下图是windows应用程序传递消息的过程: 如在 ...

  6. Ubuntu 14.04 64bit上curl-7.37源码包中的sample 源码示例研究

    curl是Linux平台上(本人不考虑其他平台)很好用的一个工具软件,它有命令行,有C接口API,更常见的编程用途是php和python版本.如果在C/C++平台上使用curl,可以直接去官网 htt ...

  7. Android开发——Android Studio中配置及使用OpenCV示例

    from: http://www.mobile-open.com/2015/86176.html 本文主要讲述了Android Studio中配置及使用OpenCV示例,现在整理出来分享给Androi ...

  8. 用键盘全局钩子[Hook]监视多进程键盘操作

    用键盘全局钩子[Hook]监视多进程键盘操作 闲来无事,在WIN2K下用BCB5做了个键盘挂钩小程序,监视全局按键情况.Hook安放和回调函数放在一个单独DLL中,DLL原码如下: //------- ...

  9. Python小练习2:pandas.Dataframe使用方法示例demo

    pandas.Dataframe使用方法示例demo 本文通过一个实例来介绍pandas.Dataframe的各种常用操作,问题总结并修改自coursera上南京大学的课程:用Python玩转数据. ...

最新文章

  1. 在坚持了15年后,我毅然决定离开 Linux,投入 Mac 的怀抱
  2. 疫情影响全景图:疫情对各行业短中期影响!
  3. 【转】Android 4.3源码的下载和编译环境的安装及编译
  4. 设计模式之Composite
  5. 进入软件开发行业必须要掌握的基础知识(2005-5-18)
  6. faked 一个用于 mock 后端 API 的轻量工具
  7. HashMap源码学习
  8. python choice添加下拉框_自定义Django Form中choicefield下拉菜单选取数据库内容实例...
  9. 前世今生:蚂蚁金服自研数据库OceanBase的道路与思考
  10. python最佳框架_Web开发的10款最佳Python框架
  11. python代替mathematica_在 Mathematica 里与 Python 交互
  12. 如何用 Excel 排查重复的数据
  13. php动态页面引用,怎么在动态网页PHP中引用的使用注意事项
  14. java中nul值的处理
  15. 军工电子产品环境可靠性测试试验实验室GJB150A
  16. js获取ip本机地址
  17. 基于单片机的超声波测距仪的设计
  18. saas系统项目总结
  19. android 4k手机屏幕分辨率,【11-09讨论】手机上4K屏幕真的有必要吗?
  20. weka的java环境配置_weka学习(安装和部署)

热门文章

  1. Cracer8-模块和正则表达式
  2. Linux安装JDK完整步骤
  3. 3. 从零开始学CSRF
  4. 嵌入式视频处理基础(一)
  5. PHP配置限制文件大小上传
  6. 4个值得注意的点(先记后写)
  7. Atitit.解决org.hibernate.DuplicateMappingException: Duplicate class/entity mapping
  8. Image Processing --- Gaussian Pyramid Laplacian Pyramid
  9. 高清网络视频无损FLV教程
  10. MongoDB学习之在Linux下安装MongoDB