钩子,英文为hooks。在程序中应用相当广泛,但是究竟什么是钩子呢?本人介绍一下目前本人对钩子的理解和相关心得。

假如有这么一段程序流:

function fun(){
funA();
funB();
}

fun函数正常的执行顺序,肯定是执行完funA,然后执行funB,然后fun函数就结束了。但是,假如我们想对函数做一些变化。比如说,fun是一个解析函数,我们希望后期可以提供丰富的解析函数,而究竟用哪个函数解析,我们希望在配置文件中配置。这个时候就可以发挥钩子的力量了。

我们可以在function fun(){}

中加入一个挂钩点H,然后再执行H这个函数之前,将钩子函数配置好,我么就可以根据需要来解析了。

例如:

$h=config_item("parser_fun") ;                           //从配置文件中获得相应的配置信息
function fun($data){
global $h;
return $h();
}

当然前提,我们得有自己的解析函数。

除此意外,PHP还可以根据字符串提供自己的类,然后调用类的一个方法,传递某些参数,这些就为PHP程序的编写,以及后期的维护扩展奠定了,相当坚实的基础。

类的实现方法,大致如下:

$c=get_class_name(); //获得类的名字

$m=get_method_name(); //获得方法的名字

$k=$c->$m(); //执行类的某一个方法

钩子在PHP中应用还是相当广泛的,就目前笔者所知的Codeigniter和Drupal中钩子的应用做出如下介绍:

CodeIgniter中钩子的应用,主要是将所有钩子应用给了一个类Hook类,他向开发者对CI进行扩展,CI提供了几个挂钩点,在CodeIgniter的整个执行过程中,加入一些开发者自己的函数,而在Hook类的内部,根据外部config.php和hooks.php中的相应配置,获得相应的类或者单独的函数,然后执行之。当然这些类或者方法都是开发者自己写的。这样就可以让开发者用的更加舒心,感觉比较舒服,毕竟每个开发者应该都想在一个框架中加入更多的自己的东西。详细情况可以参看CodeIgniter官方文档,关于钩子的那一节:CodeIgniter钩子应用.

而在Drupal中钩子的应用更是无处不在,他本身就是靠钩子维护了一个体系,Module,Block,Node各个部分的实现,都是经过根本的hook函数,然后将函数名经过相应的改变,然后调用该函数得到了整个的hook结构,甚至于到显示层theme的实现,都覆盖了theme主题的api,更加令人佩服的一件事是,他居然还可以用可视化的角度,来实现相应的theme钩子,这样就将主题的开发分为了开发者和设计者两大类,设计者对可视化更敏感,而开发者对函数更为敏感。两者都可以从各自的角度,对drupal进行相应的改变。岂不快哉!

谈PHP中的钩子的更多相关文章

  1. 浅谈Java中的equals和==(转)

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...

  2. 由项目浅谈JS中MVVM模式

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.    背景 最近项目原因使用了durandal.js和knock ...

  3. 浅谈Linux中的信号处理机制(二)

    首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...

  4. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

  5. 浅谈Java中的equals和==

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...

  6. 转【】浅谈sql中的in与not in,exists与not exists的区别_

    浅谈sql中的in与not in,exists与not exists的区别   1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...

  7. 浅谈iOS中的userAgent

    浅谈iOS中的userAgent   User-Agent(用户代理)字符串是Web浏览器用于声明自身型号版本并随HTTP请求发送给Web服务器的字符串,在Web服务器上可以获取到该字符串. 在公司产 ...

  8. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

  9. 浅谈sql中的in与not in,exists与not exists的区别

    转 浅谈sql中的in与not in,exists与not exists的区别   12月12日北京OSC源创会 —— 开源技术的年终盛典 »   sql exists in 1.in和exists ...

随机推荐

  1. TensorFlow 图像预处理(一) 图像编解码,图像尺寸调整

    from: https://blog.csdn.net/chaipp0607/article/details/73029923 TensorFlow提供了几类图像处理函数,下面介绍图像的编码与解码,图 ...

  2. JavaWeb学习总结(三)response与request

    一.response response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse.在客户端发出每个请求时,服务器 ...

  3. regular

    regular.py import re # . # 只能匹配一个字母,而不是2个或0个 # \ # 转义 # 'abc\\.com' r'abc\.com' # 字符集[] # 匹配他所包括的任意字 ...

  4. Mutual information and Normalized Mutual information 互信息和标准化互信息

    实验室最近用到nmi( Normalized Mutual information )评价聚类效果,在网上找了一下这个算法的实现,发现满意的不多. 浙江大学蔡登教授有一个,http://www.zju ...

  5. ZipHelper

    using ICSharpCode.SharpZipLib.Zip; using System.Collections.Generic; using System.IO; namespace WLYD ...

  6. 【216】◀▶ IDL 字符串操作说明 (黑底)

    参考:String Processing Routines —— 字符串处理函数 参考:IDL_String Methods 01   STRING 返回字符串. 02   STRCMP 比较字符串, ...

  7. 怎样使一个INPUT框里的文字在框被点击后自动全选或清除?

    $("#smsContent").focus(function(){ this.select(); }); <input name="keywords" ...

  8. E20190324-hm

    splice  vt. 绞接; 捻接(两段绳子); 胶接; 粘接(胶片.磁带等); n. 胶接处,粘接处,铰接处;

  9. 51nod 1456【强连通,缩点,并查集】

    话说这道题的机遇是看到了http://blog.csdn.net/u010885899/article/details/50611895很有意思:然后就去补了这题 题意: 建最少的边使得给出的点相连. ...

  10. 如何快速将vc++的类转换为c#/cli

    所有需要的工具: 1. TextTemplate 2. P/Invoke Interop Assistant 3. DotNetResolver vc++的native类一般是无法直接暴露在.net环 ...