钩子,英文为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. Centos下Docker安装与使用的相关命令

    sudo yum install -y yum-utils device-mapper-persistent-data lvm2 systemctl docker status yum-config- ...

  2. Derived 派生类

    #include "stdafx.h"#include "iostream" using namespace std; class Base1{public: ...

  3. python中的linspace,meshgrid,concatenate函数

    linspace可以用来实现相同间隔的采样. numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None) ...

  4. shell之sort和uniq 及wc 的使用

    文本排序:sort       -n:数值排序       -r: 降序       -t: 字段分隔符       -k: 以哪个字段为关键字进行排序       -u: 排序后相同的行只显示一次 ...

  5. DLL的远程注入技术

    DLL的远程注入技术是目前Win32病毒广泛使用的一种技术.使用这种技术的病毒体通常位于一个DLL中,在系统启动的时候,一个EXE程序会将这个DLL加载至某些系统进程(如Explorer.exe)中运 ...

  6. 【原】RHEL6.0企业版安装

    作者:david_zhang@sh [转载时请以超链接形式标明文章] 链接:http://www.cnblogs.com/david-zhang-index/p/4166846.html 本文适用RH ...

  7. 方法名的string类型应用(补)

    string strClass = "stringConvertClass.test"; //命名空间+类名 string strMethod = "Method&quo ...

  8. Aaronson

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...

  9. sql语句之查询操作

    语法顺序: select distinct 字段1,字段2,字段3 from 库.表 where 条件 group by 分组条件 having 过滤 # 执行顺序的话,到这步会返回运行select语 ...

  10. 如何用纯js做一个大富翁游戏

    下面这张是效果图: 先立个flag,一个星期内把这个坑填了