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 相关文章推荐
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
Apr 12 PHP
thinkphp获取栏目和文章当前位置的方法
Oct 29 PHP
ThinkPHP文件缓存类代码分享
Apr 22 PHP
php筛选不存在的图片资源
Apr 28 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
May 12 PHP
php实现表单多按钮提交action的处理方法
Oct 24 PHP
php中array_slice和array_splice函数解析
Oct 18 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
PHP7下协程的实现方法详解
Dec 17 PHP
PHP convert_uudecode()函数讲解
Feb 14 PHP
PHP实现八皇后算法
May 06 PHP
php web环境和命令行环境下查找php.ini的位置
Jul 17 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版(1)
2006/10/09 PHP
php之字符串变相相减的代码
2007/03/19 PHP
php获取文章上一页与下一页的方法
2014/12/01 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
微信第三方登录(原生)demo【必看篇】
2017/05/26 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
Javascript 读后台cookie代码
2008/09/15 Javascript
JavaScript中的onerror事件概述及使用
2013/04/01 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
2014/05/05 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
2014/05/22 Javascript
JavaScript表格常用操作方法汇总
2015/04/15 Javascript
微信小程序前端源码逻辑和工作流
2016/09/25 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
jQuery代码实现实时获取时间
2017/01/29 Javascript
基于JavaScript实现本地图片预览
2017/02/08 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
2017/04/13 jQuery
angular1配合gulp和bower的使用教程
2018/01/19 Javascript
vue组件内部引入外部js文件的方法
2020/01/18 Javascript
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
2020/09/11 Javascript
使用Python的Twisted框架编写非阻塞程序的代码示例
2016/05/25 Python
Python深入06——python的内存管理详解
2016/12/07 Python
Python json 错误xx is not JSON serializable解决办法
2017/03/15 Python
Python 获取主机ip与hostname的方法
2018/12/17 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
2019/06/27 Python
python关闭占用端口方式
2019/12/17 Python
使用css3和jquery实现可伸缩搜索框
2014/02/12 HTML / CSS
德国宠物用品、宠物食品及水族馆网上商店:ZooRoyal
2017/07/09 全球购物
速卖通欧盟:Aliexpress EU
2020/08/19 全球购物
临床医学大学生求职信
2013/09/28 职场文书
社会治安综合治理管理责任书
2014/04/16 职场文书
祖国在我心中演讲稿300字
2014/05/04 职场文书
小学生放飞梦想演讲稿
2014/08/26 职场文书
庆祝教师节标语
2014/10/09 职场文书
2014年网管工作总结
2014/12/11 职场文书
理想国读书笔记
2015/06/25 职场文书
解决xampp安装后Apache无法启动
2022/03/21 Servers