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编写大型网站问题集
Mar 06 PHP
重新封装zend_soap实现http连接安全认证的php代码
Jan 12 PHP
php函数指定默认值方法的小例子
Dec 04 PHP
php生成随机颜色的方法
Nov 13 PHP
php实现用于计算执行时间的类实例
Apr 18 PHP
屏蔽PHP默认设置中的Notice警告的方法
May 20 PHP
PHP 接入微信扫码支付总结(总结篇)
Nov 03 PHP
php+mysql实现简单登录注册修改密码网页
Nov 30 PHP
PHP使用xpath解析XML的方法详解
May 20 PHP
laravel实现上传图片并在页面显示的例子
Oct 14 PHP
TP5框架实现签到功能的方法分析
Apr 05 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
Sep 15 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中的unset究竟会不会释放内存
2013/07/18 PHP
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
2017/08/10 PHP
laravel使用Faker数据填充的实现方法
2019/04/12 PHP
Javascript 函数中的参数使用分析
2010/03/27 Javascript
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
Jquery 最近浏览过的商品的功能实现代码
2010/05/14 Javascript
JQuery插件iScroll实现下拉刷新,滚动翻页特效
2014/06/22 Javascript
学习JavaScript设计模式(继承)
2015/11/26 Javascript
使用RequireJS库加载JavaScript模块的实例教程
2016/06/06 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
JS插件plupload.js实现多图上传并显示进度条
2016/11/29 Javascript
深入理解vue.js中的v-if和v-show
2017/06/22 Javascript
AngularJS中下拉框的高级用法示例
2017/10/11 Javascript
vue实现tab切换外加样式切换方法
2018/03/16 Javascript
JS基于封装函数实现的表格分页完整示例
2018/06/26 Javascript
JavaScript Array对象基本方法详解
2019/09/03 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
2020/09/11 Javascript
[05:05]第三天的dota2
2013/07/29 DOTA
python实现马耳可夫链算法实例分析
2015/05/20 Python
Django框架使用富文本编辑器Uedit的方法分析
2018/07/31 Python
Python中dict和set的用法讲解
2019/03/28 Python
10款最好的Python开发编辑器
2019/07/03 Python
python实现微信小程序用户登录、模板推送
2019/08/28 Python
在Django下测试与调试REST API的方法详解
2019/08/29 Python
python集合的创建、添加及删除操作示例
2019/10/08 Python
css3.0新属性效果在ie下的解决方案
2010/05/10 HTML / CSS
css3 边框、背景、文本效果的实现代码
2018/03/21 HTML / CSS
HTML5 创建canvas元素示例代码
2014/06/04 HTML / CSS
Emma Bridgewater官网:英国餐具制造商
2019/11/24 全球购物
七一党建活动方案
2014/01/28 职场文书
2014年3.15团委活动总结
2014/03/16 职场文书
企业爱岗敬业演讲稿
2014/09/04 职场文书
营销经理工作检讨书
2014/11/03 职场文书
软件项目经理岗位职责
2015/04/01 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers