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 mcrypt可逆加密算法分析
Jul 19 PHP
获取PHP警告错误信息的解决方法
Jun 03 PHP
php遍历CSV类实例
Apr 14 PHP
PHP获得数组交集与差集的方法
Jun 10 PHP
学习php设计模式 php实现合成模式(composite)
Dec 08 PHP
谈谈 PHP7新增功能
Dec 16 PHP
php session实现多级目录存放实现代码
Feb 03 PHP
php源码 fsockopen获取网页内容实例详解
Sep 24 PHP
PHP实现移除数组中为空或为某值元素的方法
Jan 07 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
Sep 13 PHP
PHP利用百度ai实现文本和图片审核
May 08 PHP
PHP加MySQL消息队列深入理解
Feb 27 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中定义网站根目录的常用方法
2010/08/08 PHP
麦鸡的TAB切换功能结合了javascript和css
2007/12/17 Javascript
jQuery 全选效果实现代码
2009/03/23 Javascript
javascript 判断中文字符长度的函数代码
2012/08/27 Javascript
js遍历td tr等html元素
2012/12/13 Javascript
jquery 实现二级/三级/多级联动菜单的思路及代码
2013/04/08 Javascript
Jquery取得iframe下内容的方法
2013/11/18 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
Vue使用vue-cli创建项目
2017/09/01 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
vue h5移动端禁止缩放代码
2019/10/28 Javascript
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
[03:09]DOTA2亚洲邀请赛 LGD战队出场宣传片
2015/02/07 DOTA
[04:16]完美世界DOTA2联赛PWL S2 集锦第一期
2020/11/23 DOTA
Python的函数嵌套的使用方法
2014/01/24 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
2018/03/13 Python
通过python爬虫赚钱的方法
2019/01/29 Python
pyhton中__pycache__文件夹的产生与作用详解
2019/11/24 Python
节日快乐! Python画一棵圣诞树送给你
2019/12/24 Python
使用pytorch和torchtext进行文本分类的实例
2020/01/08 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
利用python绘制正态分布曲线
2021/01/04 Python
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
深入理解HTML的FormData对象
2016/05/17 HTML / CSS
伦敦最受欢迎的蛋糕店:Konditor & Cook
2019/11/01 全球购物
请说出你所知道的线程同步的方法
2013/04/19 面试题
C#中的验证控件有几种
2014/03/08 面试题
个人简历自我评价
2014/01/06 职场文书
美德少年事迹材料
2014/01/23 职场文书
《孔繁森》教学反思
2014/04/17 职场文书
水电站项目建议书
2014/05/12 职场文书
2015年房地产个人工作总结
2015/05/26 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
PHP控制循环操作的时间
2021/04/01 PHP
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js