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 分页函数multi() discuz
Jun 21 PHP
php面向对象全攻略 (五) 封装性
Sep 30 PHP
php不允许用户提交空表单(php空值判断)
Nov 12 PHP
CI框架中集成CKEditor编辑器的教程
Jun 09 PHP
PHP将字符分解为多个字符串的方法
Nov 22 PHP
PHP使用header()输出图片缓存实例
Dec 09 PHP
php根据日期或时间戳获取星座信息和生肖等信息
Oct 20 PHP
变量在 PHP7 内部的实现(二)
Dec 21 PHP
PHP模板引擎Smarty内建函数section,sectionelse用法详解
Apr 11 PHP
PHP实现二维数组去重功能示例
Jan 12 PHP
Django中的cookie与session操作实例代码
Aug 17 PHP
PHP Trait功能与用法实例分析
Jun 03 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开发过程中常用函数收藏
2009/12/14 PHP
浅析PHP程序设计中的MVC编程思想
2014/07/28 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
2014/10/16 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
Yii2中添加全局函数的方法分析
2017/05/04 PHP
PHP实现的DES加密解密类定义与用法示例
2020/11/02 PHP
[对联广告] JS脚本类
2006/08/27 Javascript
JS实现点击按钮自动增加一个单元格的方法
2015/03/09 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
浅谈jquery的map()和each()方法
2016/06/12 Javascript
JavaScript生成.xls文件的代码
2016/12/22 Javascript
JS实现隔行换色的表格排序
2017/03/27 Javascript
Node实战之不同环境下配置文件使用教程
2018/01/02 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
新手必须知的Node.js 4个JavaScript基本概念
2018/09/16 Javascript
jQuery操作选中select下拉框的值代码实例
2020/02/07 jQuery
VUE子组件向父组件传值详解(含传多值及添加额外参数场景)
2020/09/01 Javascript
JavaScript实现浏览器网页自动滚动并点击的示例代码
2020/12/05 Javascript
初步解析Python下的多进程编程
2015/04/28 Python
Python+selenium实现截图图片并保存截取的图片
2018/01/05 Python
django 自定义过滤器的实现
2019/02/26 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
Pycharm调试程序技巧小结
2020/08/08 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
Bobbi Brown芭比波朗美国官网:化妆师专业彩妆保养品品牌
2016/08/18 全球购物
美国娱乐和流行文化商品店:FYE
2017/09/14 全球购物
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
什么是GWT的Entry Point
2013/08/16 面试题
三查三看党性分析材料
2014/02/18 职场文书
缓刑人员思想汇报500字
2014/09/12 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
推荐信范文大全
2015/03/27 职场文书
医院保洁员管理制度
2015/08/05 职场文书
Mysql效率优化定位较低sql的两种方式
2021/05/26 MySQL
使用pd.merge表连接出现多余行的问题解决
2022/06/16 Python