hooks这玩意,一向是被认为是可扩展的代名词,当一个系统启动了hooks后,他就变得可扩展了,同样,他的性能也就需要被众人拿出来做比较了。
目前被很多人拿来做比较的是两款程序:drupal和wordpress,是使用量最大的博客程序之一,在很多人眼里,这两个程序已经脱离了博客,而是CMS了。drupal前后台不分是我最不舒服的地方,所以wordpress才是我的首选。或许大家看到我的TAG里面还有ThinkPHP和QeePHP,那是因为这两个框架都在考虑有行为加入,行为嘛,相对于框架,就当于一个hooks,所以我也加上了这两个框架
thinkphp的Add_filter,add_action和wordpress有点相像 ,而qee因为没有仔细看过,所以不太清楚(flea的时候好象没这个功能)
跑题半天了。上文了
Drupal怎么就知道什么时候调用一个模块来处理特定的请求?
这个是通过Drupal的hook机制完成的,下面解释一下hook的工作机制。
当Drupal处理来自用户的一个请求,它通过一系列步骤进行。比如:Drupal核心首先引导这个应用,确定关键变量和经常使用的功能。接下来,它加载 关键库、主题和模块。接下来,它继续处理请求,将请求的URI映射到正确的处理代码,等等。然后它为数据应用一个主题,为输出来格式化信息。最后它返回输 出结果到用户的浏览器。
在循序渐进的预定义时刻,Drupal进行勾取。这意味着什么呢?简短的说,它意味着Drupal测试部分或全部当前启用的模块,寻找遵循特定的预定义模 块的函数。一些已经连接这个进程到“回调”的模式经常被用在事件处理模块中。Drupal和这个是类似的,但是更加充满活力。
比如说,当它正在创建一个页面浏览内容时,Drupal可能再模块中寻找叫做<modulename>_block() 和<modulename>_view()的函数(在这里<modulename>被每个Drupal检测的模块的名称代替)。 寻找模块包含的这些函数被叫做实施hook_block()和hook_view()勾取。
当Drupal找到这些函数,它执行它们,并且利用这些函数返回的数据创建一个响应来发送给用户。然后Drupal继续循序渐进的处理请求,或许在它进行 过程中执行许多其它的钩子。
当所有的步骤完成并且一个响应发送给用户,Drupal自动清除并且推出。
模块可以定义自己的钩子,这些钩子又可以被其他模块使用。这样一来,hook机制可以扩展到提供复杂的定制行为。
当一个模块提供匹配一个钩子的签名的功能,我们就说那个模块执行那个钩子。比如,假设Drupal有一个叫做hook_example()的钩子。如果我 们定义一个叫做 mymodule 并且包含一个叫做 mymodule_example() 函数的模块,我们就会用到 hook_example().
Hook对于面向对象程序员的启示:
那些对面向对象编程熟悉的程序员可能发现在面向对象语言中考虑将钩子作为一个类似于接口方法或者抽象方法的机制是很有用的。钩子是Drupal将寻找的函 数并在某些情况下需要出现在你的模块中。就像接口方式,一个钩子的函数签名必须匹配Drupal的预期签名。而和接口不同的是,模块开发者可以选择(在一 定程度上)哪个钩子去实现、哪个钩子去忽视。Drupal不要求每个定义的钩子都实现。
参考:《Learning Drupal 6 Module Development》
原文来自:http://www.cnblogs.com/stylesheet/archive/2010/04/16/1713512.html,上次我也写过wordpress的hooks,其实原理都差不多。