WordPress的可拓展性初探(二)

作者:西瓜玩偶(racnil070512 at hotmail dot com) 上一篇文章介绍了如何设计数据库,从而达到可拓展性的目的。下面的篇幅将介绍在PHP的代码方面,如何设计才能达到可拓展性。 2. 钩子(hook)方法 在给一个系统书写插件的时候,我们往往需要在原来工程的某个特定位置加入一段代码。如果原来的工程没有任何特殊的设计,那么我们的做法肯定是找出原来工程的相关代码,然后在里面插入我们想要实现的功能,但是这样就毫无扩展性可言了。例如,原工程如果有升级,那么我们拿到了原工程的代码之后,又要找到原来的地方,又要重新插入一遍自己想要实现的功能,费时费力。 在WordPress中,为了避免这样的问题,引入了一个钩子方法的概念。所谓“钩子”,其实可以理解为代码的插入点。这也就是说,如果原工程在设计时加入了钩子方法的调用,我们便可以在调用钩子方法的地方插入代码。WordPress在设计的时候考虑得相当周到,可以说插件开发者需要插入代码的地方,都已经有了钩子方法了。 钩子方法的本质其实就是是动态调用函数。每一个钩子方法都有特定的名称以及定义,例如 save_post ,表示当一篇文章被保存时需要执行的代码,WordPress在调用这个方法时,会给我们传入被保存的文章ID。 如果我需要在文章被保存的时候执行一些特殊功能,比如说给某个指定的邮箱发邮件。那么我首先需要在插件中实现发邮件的功能,并且在特定的钩子方法中注册我的函数。例如: function sent_email_to_myself($post_id) { // 这里略过实现发送Email的功能…… } add_action('save_post', 'send_email_to_myself', 10, 1); add_action 是由WordPress定义的函数。其中前两个参数,第一个为指定需要插入代码的位置,第二个为指定要插入那个函数。最后的两个参数一个表明执行的优先级,一个表明接受的参数数量,与下文内容并无太大关系,故此处略过。 当我们打开一个WordPress页面时,WordPress会遍历插件列表,执行每一个插件的入口PHP文件。这样上述代码就会被执行,我们的插件就利用 add_action 函数的调用,把发送邮件的功能注册在了 save_post 这个钩子方法上。到了保存文章的时候,WordPress会调用 save_post 这个钩子方法——它首先查找钩子方法的注册列表,找出有哪些函数注册在了 save_post 上,然后根据优先级顺序依次调用执行。这样就达到了在特定的位置执行插件定义的代码的目的。 这样做的好处是,无论WordPress如何升级,只要钩子方法的定义没有改变,那么原有插件就可以不加修改正常工作。这样就相当于降低了原工程与插件的耦合度。 然而有利必有弊,这样做的代码执行速度肯定是没有直接调用函数来得快。不过对于WordPress这样的强调高可扩展性的工程,使用这样的技巧显然是利大于弊的。我们亦可以在我们的工程中借鉴这样的思路,从而使我们的工程也具有高可扩展性。 (完) 参考资料: https://developer.wordpress.org/reference/functions/add_action/ https://codex.wordpress.org/Plugin_API/Action_Reference/save_post

原文发布于微信公众号 - php(phpdaily)

原文发表时间:2016-03-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

android apk 防止反编译技术第二篇-运行时修改字节码

上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/3...

37811
来自专栏加米谷大数据

技术分享 | Centos下 Vim快捷键操作命令大全

Vim是一个超牛的编辑器,命令功能十分强大 。而且这些命令大都可以进行组合 , 比如,9yy命令表示复制9行内容,9表示要复制的行数,同样100dd表示删除10...

35910
来自专栏编程微刊

如何把传统写法改成框架形式 es6http://www.expressjs.com.cn/

1782
来自专栏程序员互动联盟

【编程基础】聊聊C语言-兵马未动粮草先行(2)

上一篇我们讲了C语言预处理阶段的宏定义,知道了C语言中宏定义的处理和使用。现将上篇关于宏的问题的答案公布如下: 用宏定义一个字符串常量 #define str ...

3054
来自专栏HTML5学堂

Javascript解析机制 执行机制

HTML5学堂:在学习JavaScript过程中,我们需要了解事件的机制是怎么执行的?本文将会提到JavaScript事件机制的解析,希望对大家有帮助! jav...

2824
来自专栏腾讯NEXT学位

Express进阶:从一个例子看路由分组机制

2785
来自专栏鬼谷君

Linux三剑客之sed

1032
来自专栏jianhuicode

什么是编译错误,运行时错误及逻辑错误?

程序的错误主要分成三种: 编译链接错误(语法错误); 编译链接错误又分成编译错和链接错。 编译错就是普通意义上的语法错,编译器进行语法检查不通过,也就是程...

24510
来自专栏Astropeak

Python:怎样用线程将任务并行化?

1707
来自专栏前端杂谈

项目中如何使用babel6详解

2898

扫码关注云+社区