钩子,英文为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. easyui-tabs 在ie8下基于iframe嵌套页面加载成功后切换空白问题

    这是一个很坑的问题,由于项目必须支持ie8的情况下,产生了这个问题.在我进行逐步对比的分析过后,终于发现了原因所在:

  2. codeforces 669A A. Little Artem and Presents(水题)

    题目链接: A. Little Artem and Presents time limit per test 2 seconds memory limit per test 256 megabytes ...

  3. CentOS6.3安装 Oracle 11g R2

    1.设置系统1.1.包需求 11g很人性化了,增加了检查的机制,还有就是不象10g那样在64位下要安装很多的32位包,只需要安装一个gcc-32bit-4.3就OK了.下列表必须要安装:binutil ...

  4. oracle 导入imp 命令

    最常用的      imp  name/password@IP:1521/orcl[库] file="c:\123.dmp" full=y ignore=y. 例:imp abc/ ...

  5. Datawindow.net中实现让当前行选中,并且当前行以其他颜色显示

    如何在Datawindow.net中实现让当前行选中,并且当前行以其他颜色显示 使用Datawindow.net要选中一行是很容易的意见事情,有很多种办法可以实现,最简单的莫过于使用selectrow ...

  6. libvirt kvm云主机监控

    libvirt

  7. Hibernate使用Query进行查询

    错误结果如下 Exception in thread "main" org.hibernate.hql.internal.ast.QuerySyntaxException: new ...

  8. jQuery 字母大小写转换

    "ABC".toLowerCase()//转小写 "abc".toUpperCase()//转大写

  9. (水题)洛谷 - P2439 - 阶梯教室设备利用 - 简单dp

    https://www.luogu.org/fe/problem/P2439 很明显时间是一个维度,按照时间顺序决策就行了. dp[i]表示以时间i为结尾所能达到的最长演讲时间. #include & ...

  10. RXSwift01

    //创建 Observable 序列 func createObservable(){ /* let observable = Observable<Int>.just(5) let ob ...