文档章节

PHP的钩子实现解析

熊猫88
 熊猫88
发布于 2015/12/24 11:28
字数 876
阅读 1801
收藏 4
点赞 0
评论 0

钩子是编程里一个常见概念,非常的重要。它使得系统变得非常容易拓展,(而不用理解其内部的实现机理,这样可以减少很多工作量)。只要有一个钩子样本,能很容易仿照第一个钩子快速的编写第二个钩子,这里对钩子进行一个简单的理解小结。
     下面一个最简单的代码例子:
    <?php
  class   Test   {
public  static  function   example() {
    $arr = array(1,2,3,4,5,6);
   echo  "I am a Hook test<br />";
   echo    "hello<br />";
  echo   "<pre>";
   print_r($arr);
       echo    "</pre>";
}
}
Test::example();
?>
一个测试类里面,写了一个example方法。本来这个example的方法非常简单的,就是输出hello。但是在输入的时候,我们还有其他的事情要做(这里我假定了在输入hello之前有一个字符串要输出,在结尾有个数组要输出)。我们现在有俩种写法:
第一:我们可以直接在方法里面实现我们需要的功能
但是会有个问题,就是我们每次更动系统,都需要去更改系统的内核部分(我们假定test是系统的内核,当内核代码非常多的时候,开发的时候不适宜直接改动内核部分)这样会需要我们每次改动都要跳到类test内部去改动,这样的开发成本会非常大,而且代码全部在一起非常的不好维护。
第二:我们封装一个exec的方法
  function  exec($parms) {
    if(is_array($parms)) {
        echo   "<pre>";
       print_r($parms);
       echo    "</pre>";
    }  else  {
        echo        $parms;
    }
 }
 这样我们实现的时候,方便了很多,下面的方法简化成了
   class   Test   {
public  static  function   example() {
   exc("I am a Hook test<br />");
   echo    "hello<br />";
   $arr = array(1,2,3,4,5,6);
  exec($arr);
}
}
 但是现在仍然有个问题,我们改动的时候,仍然要去系统内部改动(我们最终需要的目标是不改动内核的情况下,可以直接改动,如果是简单的数组和字符串,是可以进行配置的,但是如果是逻辑的时候,配置行不通)。我们想的是写一个类(通过这个类,向系统发送信息的时候,系统可以直接调用我们的类,而且我们的类只要遵循一定的规则设计,直接和原系统是相容的)。做了改进设计出如下钩子格式:

 <?php
  class   Test   {
public  static  function   example() {
   Hook::exec("string");
   echo    "hello<br />";
   Hook::exec("arr");
}
}
class  Hook  {
 static  public function  exec($type,$model=' ') {
      if($model=' ') {
         $m = new hello();
      }  else {
       $m = new $model();
 }
      
    if($type=='string') {     
        $m->string();
    }  elseif($type=='arr') {
      
        $m->arr();    
    }
}
}
//我们只要改动一个外部的hello类 就可以实现对系统内部的控制了。
class   hello  {
 public  function  string() {
     $str="I am a Hook test<br />";
    echo   "$str <br />";
 }
public  function arr() {
    $arr =array(1,2,3,4,5,6);
   echo   "<pre>";
   print_r($arr);
   echo    "</pre>";
}
}
Test::example();
?>

从上面可以看出,组成一个单独的类,系统内部的实现固定了后。外部可以写各种类,进行钩子的实现,现在写了一个hello类。假如增加一个拓展world类
同样可以仅仅改动Hook,而不用去改动Test系统内部,只要我们定义一个抽象类
abstract  class  lan {
  abstract  function  string() ;
  abstract function arr();
}
然后让所有的扩展类,比如hello或者另外写个类world继承这个抽象类,就可以直接写个扩展。

© 著作权归作者所有

共有 人打赏支持
熊猫88
粉丝 18
博文 63
码字总数 65287
作品 0
程序员
PHP钩子是什么?

PHP 写插件 其中的HOOK 只是别人想的一个词语,术语而已 并无实际意义 在WINDOWS编程中 HOOK==钩子 是一种消息机制的一种 意思就是:蚊子叮了你一口,你的大脑神经接收到了,于是指挥肢体,去...

lg2045 ⋅ 2013/05/10 ⋅ 1

Web 开发模板引擎--TagFeather

TagFeather 是一个让美工不用去学任何程序代码,只需要借助流行工具就能所见所得的预览的 Web 开发模板引擎。简单的讲,页面设计人员只需要按照程序员指定的 CSS Class 和 ID 就什么都不用管...

匿名 ⋅ 2010/03/01 ⋅ 0

PHP底层工作原理

简介 先看看下面这个过程: 我们从未手动开启过PHP的相关进程,它是随着Apache的启动而运行的; PHP通过modphp5.so模块和Apache相连(具体说来是SAPI,即服务器应用程序编程接口); PHP总共...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

ci源码解析之CodeIgniter.php

ci/core/CodeIgniter.php是ci框架的核心处理文件,其处理流程如下: 1 require了3个文件 BASEPATHcore/Common.phpcore/Compat.phpAPPPATHconfig/constants.php 2 加载Benchmark,并打时间戳 ...

shigebeyond ⋅ 2015/01/29 ⋅ 0

从运行原理及使用场景看Apache和Nginx

本文只作为了解Apache和Nginx知识的一个梳理,想详细了解的请阅读文末参考链接中的博文。 Web服务器 Web服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。 应用层使...

waveer ⋅ 2016/10/31 ⋅ 0

Tomcat的对象化处理和apache的统一式处理

tomcat是一个很优秀的轻量级的web引擎和java容器,它本身用java开发,而java是一个面向对象的语言,因此面向对象的语言开发出来的tomcat当然也就继承了面向对象的特征,tomcat还说明,OO真的...

晨曦之光 ⋅ 2012/04/10 ⋅ 0

Apache和Nginx运行原理解析

Web服务器 Web服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。 应用层使用HTTP协议。 HTML文档格式。 浏览器统一资源定位器(URL)。 Web服务器常常以B/S(Browser...

小杨_Ivan ⋅ 2017/02/09 ⋅ 0

Swoole 1.10.0 发布,增加多项新特性

PHP的异步、并行、高性能网络通信引擎 Swoole 已发布 1.10.0 版本。此版本增加了多项新特性。 自动 DNS 解析 新版本的异步客户端不再需要使用 swooleasyncdnslookup 解析域名了,底层实现了自...

matyhtf ⋅ 01/08 ⋅ 11

从运行原理及使用场景看Apache和Nginx

一,Web服务器 Web服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。 应用层使用HTTP协议。 HTML文档格式。 浏览器统一资源定位器(URL)。 Web服务器常常以B/S(Bro...

leejia1989 ⋅ 2014/07/07 ⋅ 0

ThinkPHP核心框架实现

之前和朋友一块学过够语言,作为系统级别的语言,没有一定的功力和系统编程 经验,很难快速的搭建起来可堪来用的代码块 刚好在公司在用ThinkPHp,这个框架还算是友好,比较灵活。加上PHP的很...

jackdongting ⋅ 2017/09/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 9分钟前 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 14分钟前 ⋅ 0

Redis入门详解(转)

Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis应用场景 Redis总结 Redis简介: Redi...

xiaoyaoyoufang ⋅ 26分钟前 ⋅ 0

说说javascript中的那些专业名词

DOM(Document Object Model) 文档对象模型 BOM(Browser Object Model) 浏览器对象模型 ECMA(European Computer Manufacturer's Association) 欧洲计算机制造商协会 W3C(World Wide Web Conso......

hang1989 ⋅ 46分钟前 ⋅ 0

Bootstrap Wizard 多步表单控件

废话 有一块需求是 有多步表单 点击下一步时触发验证一个范围内的表单,点击上一步或取消,清空表单并返回第一步,点击最后一步提交整个表单的 就找到了这个插件,本来自己写了一个原生的 fo...

无极之岚 ⋅ 今天 ⋅ 0

如何利用Spring Cloud构建起自我修复型分布式系统

利用Netflix所打造的组件及各类大家熟知的工具,我们完全可以顺利应对由微服务以及分布式计算所带来的技术挑战。 在过去一年当中,微服务已经成为软件架构领域一个炙手可热的新名词,而且我们...

harries ⋅ 今天 ⋅ 0

临近实习前的感想

再过两星期就要开始新的一段实习了,想想去年的这个时候也在实习,心中不免思绪万千,也一直想写对2017做个总结,但一直迟迟没有下笔。 2017年的春节,我就开始准备开学后找份实习。那时候就...

无精疯 ⋅ 今天 ⋅ 0

Spring AOP(面向切面编程)

Spring AOP概念: Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后添加额外的功能。通常情况下,AOP把项目中需要在多处用到的功能,比如日志、安全和事物等集中到一个类中处理,而...

霍淇滨 ⋅ 今天 ⋅ 0

人工智能、机器学习、数据挖掘以及数据分析有什么联系?

人工智能是目前炙手可热的一个领域,所有的互联网公司以及各路大迦们纷纷表态人工智能将是下一个时代的革命性技术,可与互联网、移动互联网时代的变更相媲美;AlphaGo在围棋领域战胜人类最顶...

董黎明 ⋅ 今天 ⋅ 0

使用 vue-cli 搭建项目

vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一、 安装 node.js 首先需要安装node环境,可以直接到中...

初学者的优化 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部