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&amp;java(三)
Oct 09 PHP
PHP 远程关机实现代码
Nov 10 PHP
PHP 创建标签云函数代码
May 26 PHP
php下使用iconv需要注意的问题
Nov 20 PHP
php数组函数序列之array_search()- 按元素值返回键名
Nov 04 PHP
php中使用preg_replace函数匹配图片并加上链接的方法
Feb 06 PHP
php采用ajax数据提交post与post常见方法总结
Nov 10 PHP
php购物车实现方法
Jan 03 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
Mar 07 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
Jun 13 PHP
PHP+JQuery+Ajax实现分页方法详解
Aug 06 PHP
php回调函数处理数组操作示例
Apr 13 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 Memcache 中实现消息队列
2009/11/24 PHP
PHP生成网页快照 不用COM不用扩展.
2010/02/11 PHP
深入理解PHP中的Session和Cookie
2013/06/21 PHP
PHP面向对象程序设计之对象生成方法详解
2016/12/02 PHP
php格式化时间戳
2016/12/17 PHP
PHP ADODB实现事务处理功能示例
2018/05/25 PHP
jquery tools 系列 scrollable学习
2009/09/06 Javascript
javascript setTimeout()传递函数参数(包括传递对象参数)
2010/04/07 Javascript
seajs中模块的解析规则详解和模块使用总结
2014/03/12 Javascript
动态显示可输入的字数提示还可以输入的字数
2014/04/01 Javascript
js怎么覆盖原有方法实现重写
2014/09/04 Javascript
JavaScript中的Web worker多线程API研究
2014/12/06 Javascript
jQuery后代选择器用法实例
2014/12/23 Javascript
jQuery中html()方法用法实例
2014/12/25 Javascript
javascript面向对象程序设计(一)
2015/01/29 Javascript
JavaScript面向对象的实现方法小结
2015/04/14 Javascript
页面内容排序插件jSort使用方法
2015/10/10 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
2015/11/19 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
vue+axios+element ui 实现全局loading加载示例
2018/09/11 Javascript
JS/HTML5游戏常用算法之追踪算法实例详解
2018/12/12 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
2020/04/22 Javascript
wxPython学习之主框架实例
2014/09/28 Python
python3中str(字符串)的使用教程
2017/03/23 Python
Python wxpython模块响应鼠标拖动事件操作示例
2018/08/23 Python
关于numpy数组轴的使用详解
2019/12/05 Python
python实现tail实时查看服务器日志示例
2019/12/24 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
2020/09/17 Python
selenium携带cookies模拟登陆CSDN的实现
2021/01/19 Python
基于html5 DeviceOrientation 实现微信摇一摇功能
2015/09/25 HTML / CSS
澳大利亚电商Catch新西兰站:Catch.co.nz
2020/05/30 全球购物
杭州-飞时达软件有限公司.net笔面试
2012/04/28 面试题
介绍一下Python中webbrowser的用法
2013/05/07 面试题
简单聊聊Vue中的计算属性和属性侦听
2021/10/05 Vue.js
「魔导具师妲莉亚永不妥协~从今天开始的自由职人生活~」1、2卷发售宣传CM公开
2022/03/21 日漫