浅析WordPress中的Hook机制
Hook,既可以是动词,表示钩住,也可以是名词,表示钩子。在一个计算机程序中,Hook没有准确的并且合理的中文翻译,很多技术书籍文章,干脆就称之为“钩子”。
Hook机制(就是指Action和Filter的机制)正是WordPress能够有成千上万的插件支持的根源。
尽管我以前可能写过类似的文章来说明这个问题,但是我觉得这个东西是如此的重要,以至于如果你还没有明白什么是Hook,根本算不上走进了WP开发者的世界。又或者说,作为一个普通的玩家来说,深刻地理解Hook,能够帮助您走上DIY博客高速车道。
Hook这个东西,说难吧,很难,说容易吧,很容易,还真的不好解释。我不能保证每个看完这个文章的人能懂,知道个大概就行了。现在,我们开始。
我相信,很多像我一样的80后,会在高中的时候对编程感兴趣,你们很可能选择了一个东西作为入门,那就是Visual Basic(VB)。在VB里面,编程变成了一件非常容易的事情,画一个界面,然后这个界面上的元素会在某个事件发生的时候,触发一个函数,在这个函数里,写好你要做的事情,一个Windows桌面应用就完成了。
这种编程的模型叫做事件驱动。你们一定会写一堆叫做OnButtonClick,OnSomethingDosth之类的Sub,具体的意思,就是说,当一个按钮按下,这个事情发生的时候,执行OnButtonClick这个Sub里面的代码。Ok,我想说的就是,在WP里面,就是一种很类似的东西,一个插件的代码,就好比是OnButtonClick这一类Sub里面的代码,而我们的主角hook(可能是一个action,也可能是一个filter,比如post_content,又比如wp_head),就是一个能够触发那段代码的事件,一旦发生,插件就会开始运行。希望到这里,很多学过VB的朋友能有个认识了。
接着,时代发展了,OO,也即面向对象大行其道了。学OO,就不得不学一点设计模式了,否则,怎么敢说自己在面向对象呢?如果你碰巧看到过一个模式叫Observer的,那么我愚蠢地以为,可以从一定程度上解释hook机制。把整个WP,看作是一个对象,这个对象最终要打印一个网页出来,这个网页会按照PHP代码的先后顺序,一块一块生成,每个插件都分别是一个对象,非常关心它自己要处理的那一小块网页,它们就是各自关心的那一小块网页的观察者们。在WP初始化的时候,这些插件们就把自己添加到观察者的队列里面(即add_filter或者add_action),而它们观察WP内部的这个窗口,就是action或者filter,WP在执行到特定的时候,就会通知这些插件,某个事情发生了(即apply_filters和do_action)。
抽象过后,来一点形象的东西。我又要使用我那不着边际的比喻了。想象一根电线,上面串连着一个接一个的插座。每个插件就是一个小家电,有一个插销,他们被各自地插到了合适自己的那个插座上。然后,电流从这个电线的一头流入,每经过一个插座,这个插座上连接着的电器就开始运转了。所有电器都通电运转了一遍以后,电闸关上了。Ok,这些插座,就好像是hook,有的是action形状的,有的是filter形状的,但是本质上就是插座。
好了,我已经废了很多的唇舌了,我心里很清楚,结果可能是这样的,不理解的人,依旧不理解,理解的人,不用看就理解。虽然是这样,我还是执着地想要尝试着解释一下,因为我后面要写一个介绍Hybrid的文章,这个主题框架里面遍布着action和filter,如果不理解这个东西,无论如何也不可能用好Hybrid,同样,要说清Hybrid这个东西,无论如何也躲不过地要说一下hook。毕竟我还是想受人以渔的。