PHP钩子实现方法解析


Posted in PHP onMay 21, 2019

本文实例讲述了PHP钩子实现方法。分享给大家供大家参考,具体如下:

PHP编程的钩子实现,示例讲解和解释它们的作用,写了一个样板的钩子实现

钩子是编程里一个常见的概念,非常的重要。它使得系统变得非常容易拓展(而不用理解其内部的实现机理,这样可以减少很多工作量)。只要有一个钩子样本,能很容易仿照第一个钩子快速的编写第二个钩子,这里对钩子进行一个简单的理解。

下面是一个最简单的代码例子:

<?php
class Test
{
  public static function example()
  {
    $arr = array(1,2,3,4,5,6);
    echo '我是一个钩子测试<br>';
    echo 'hello<br/>';
    echo '<pre>';
    print_r($arr);
    echo '</pre>';
  }
}
Test::example();

浏览器运行测试输出:

我是一个钩子测试
hello
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
)

一个Test类里面,写了一个example方法。本来这个example的方法非常简单,就是输出hello,但是在这之前,我们还有其他的事情要做(这里我假定在输入hello之前,有一个字符串要输出,并且在之后有个数组要输出)。

我们现在有2种写法:

第一:直接在方法里实现我们需要的功能(就像上面代码那样)

但是这种方式有个问题,就是我们每次更改系统,都需要去更改系统的核心部分(我们假定Test是系统的核心部分),这样会需要我们每次改动都要跳到类Test内部去改动,开发成本非常大,而且代码全部在一起非常不好维护。

第二:我们封装一个execute方法

function execute($params)
{
  if(is_array($params)){
    echo '<pre>';
    print_r($params);
    echo '</pre>';
  }else{
    echo $params;
  }
}

这样我们实现的时候,方便了很多,Test类可以简化成:

class Test
{
  public static function example()
  {
    execute('我是一个钩子测试<br>');
    echo 'hello<br/>';
    $arr = array(1,2,3,4,5,6);
    execute($arr);
  }
}

但是现在仍然有个问题,我们改动的时候,仍然要去系统内部改动(如果是简单的数组和字符串,是可以进行配置,但是如果是复杂的逻辑处理,配置行不通)。

我们想写一个类(通过这个类,向系统发送消息的时候,系统可以直接调用我们的类,而且我们的类只要遵循一定的规则来设计,就和原系统是相容的)。

做了改进设计出如下钩子格式:

<?php
/**
 * 钩子类
 */
class Hook
{
  static public function execute($type, $model='')
  {
    if($model == ''){
      $m = new Hello();
    }else{
      $m = new $model();
    }
    if($type == 'string'){
      $m->string();
    }elseif($type == 'arr'){
      $m->arr();
    }
  }
}
class Test
{
  public static function example()
  {
    Hook::execute('string');
    echo 'hello<br/>';
    Hook::execute('arr');
  }
}
//我们只要改动一个外部的Hello类,就可以实现对系统内部的控制了
class Hello
{
  public function string()
  {
    $str = '我是一个钩子测试<br>';
    echo $str;
  }
  public function arr()
  {
    $arr = array(1,2,3,4,5,6);
    echo '<pre>';
    print_r($arr);
    echo '</pre>';
  }
}
Test::example();

运行结果:

我是一个钩子测试
hello

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
)

从上面可以看出,组成一个单独的类,系统的内部固定了后,外部可以写各种类,进行钩子的实现。现在写了一个Hello类,假如需要拓展一个World类,同样可以仅仅改动Hook,而不用去改动Test内部,只要我们定义一个抽象类:

abstract class lan
{
  abstract function string();
  abstract function arr();
}

然后让所有的拓展类,比如Hello类或者World类继承这个抽象类,就可以直接写个扩展。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP与javascript的两种交互方式
Oct 09 PHP
php的正则处理函数总结分析
Jun 20 PHP
关于UEditor编辑器远程图片上传失败的解决办法
Aug 31 PHP
Thinkphp模板中使用自定义函数的方法
Sep 23 PHP
php通过ksort()函数给关联数组按照键排序的方法
Mar 18 PHP
php实现图片按比例截取的方法
Feb 06 PHP
PHP数组中头部和尾部添加元素的方法(array_unshift,array_push)
Apr 10 PHP
Laravel源码解析之路由的使用和示例详解
Sep 27 PHP
php5.6.x到php7.0.x特性小结
Aug 17 PHP
Laravel 添加多语言提示信息的方法
Sep 29 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 PHP
php操作redis数据库常见方法实例总结
Feb 20 PHP
php面向对象程序设计中self与static的区别分析
May 21 #PHP
PHP经典设计模式之依赖注入定义与用法详解
May 21 #PHP
PHP常见过waf webshell以及最简单的检测方法
May 21 #PHP
PHP __call()方法实现委托示例
May 20 #PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
May 20 #PHP
PHP常量define和const的区别详解
May 18 #PHP
thinkphp5框架实现的自定义扩展类操作示例
May 16 #PHP
You might like
二招解决php乱码问题
2012/03/25 PHP
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
2013/08/07 PHP
不用AJAX和IFRAME,说说真正意义上的ASP+JS无刷新技术
2008/09/25 Javascript
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
js中符号转意问题示例探讨
2013/08/19 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
2014/05/04 Javascript
详解JavaScript中的表单验证
2015/06/16 Javascript
详解JavaScript逻辑Not运算符
2015/12/04 Javascript
学习Node.js模块机制
2016/10/17 Javascript
javascript判断回文数详解及实现代码
2017/02/03 Javascript
Angular.js实现多个checkbox只能选择一个的方法示例
2017/02/24 Javascript
Angular.JS内置服务$http对数据库的增删改使用教程
2017/05/07 Javascript
jquery+ajaxform+springboot控件实现数据更新功能
2018/01/22 jQuery
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
2019/02/02 NodeJs
javascript设计模式 ? 模板方法模式原理与用法实例分析
2020/04/23 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
[01:04:14]OG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
Python中input与raw_input 之间的比较
2017/08/20 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
django将图片上传数据库后在前端显式的方法
2018/05/25 Python
pandas把所有大于0的数设置为1的方法
2019/01/26 Python
详解Python读取yaml文件多层菜单
2019/03/23 Python
python 实现的车牌识别项目
2021/01/25 Python
Swanson中国官网:美国斯旺森健康产品公司
2021/03/01 全球购物
什么是SCM(软件配置管理)
2014/08/16 面试题
历史专业大学生职业生涯规划书
2014/03/13 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
合伙购房协议样本
2014/10/06 职场文书
长城导游词300字
2015/01/30 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
2015年党小组工作总结
2015/05/26 职场文书
CSS几步实现赛博朋克2077风格视觉效果
2021/06/16 HTML / CSS
React Fragment介绍与使用详解
2021/11/11 Javascript