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创建动态图像
Oct 09 PHP
Discuz 5.0 中读取纯真IP数据库函数分析
Mar 16 PHP
php5 mysql分页实例代码
Apr 10 PHP
php 分页函数multi() discuz
Jun 21 PHP
joomla内置的表单验证功能使用方法
Jun 11 PHP
php expects parameter 1 to be resource, array given 错误
Mar 23 PHP
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
Aug 08 PHP
php检查日期函数checkdate用法实例
Mar 19 PHP
CI操作cookie的方法分析(基于helper类库)
Mar 28 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
May 09 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
Mar 08 PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 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实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
10条php编程小技巧
2015/07/07 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
2016/03/23 PHP
PHP树形结构tree类用法示例
2019/02/01 PHP
纯JAVASCRIPT图表动画插件Highcharts Examples
2011/04/16 Javascript
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
多种方法实现load加载完成后把图片一次性显示出来
2014/02/19 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
JavaScript正则表达式实例详解
2016/10/16 Javascript
不使用script导入js文件的几种方法
2016/10/27 Javascript
jQuery列表检索功能实现代码
2017/07/17 jQuery
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
Vue框架下引入ActiveX控件的问题解决
2019/03/25 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
[02:53]DOTA2英雄基础教程 山岭巨人小小
2013/12/09 DOTA
[01:09:16]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第一场 1月25日
2021/03/11 DOTA
python使用calendar输出指定年份全年日历的方法
2015/04/04 Python
详解Python的Django框架中的通用视图
2015/05/04 Python
python从sqlite读取并显示数据的方法
2015/05/08 Python
各个系统下的Python解释器相关安装方法
2015/10/12 Python
python代码实现ID3决策树算法
2017/12/20 Python
numpy实现合并多维矩阵、list的扩展方法
2018/05/08 Python
Python爬虫实现获取动态gif格式搞笑图片的方法示例
2018/12/24 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
python如何运行js语句
2020/09/09 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
教师师德教育的自我评价
2013/10/31 职场文书
电子信息专业学生自荐信
2013/11/09 职场文书
竞选演讲稿范文
2013/12/28 职场文书
店长职务说明书
2014/02/04 职场文书
外贸员简历中的自我评价
2014/03/04 职场文书
高中班级口号
2014/06/09 职场文书
植树节标语
2014/06/27 职场文书
沙滩主题婚礼活动策划方案
2014/09/15 职场文书
2014年客服工作总结范文
2014/11/13 职场文书
Spring this调用当前类方法无法拦截的示例代码
2022/03/20 Java/Android