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 条评论
登录 后参与评论

相关文章

来自专栏Young Dreamer

VUE中的v-if与v-show

1.共同点 都是动态显示DOM元素 2.区别 (1)手段:v-if是动态的向DOM树内添加或者删除DOM元素;v-show是通过设置DOM元素的display样...

1827
来自专栏帘卷西风的专栏

mysql 大小写敏感的一个解决方案

     今天,有同事告诉我,我们游戏登陆的时候,账号和密码没有区分大小写,后来又发现创建账号和角色也没有区分大小写。思考登陆流程之后,应该是Mysql没有区分...

901
来自专栏佳爷的后花媛

php基础(二)

输出b,if中的空值赋值给$num,因此if条件必定为false,还有其他一些大同小异的题目,用=和==判断for循环的,只要把握好基本的概念就行了

912
来自专栏沈唁志

整合ThinkPHP功能系列之生成csv格式的Excel表格

1804
来自专栏玄魂工作室

RedTigers Hackit SQL 注入题解

今天在一个QQ群看到有同学做http://redtiger.labs.overthewire.org/上的题目。随手做了几题,发现还有点意思,有的题目我也一时想...

4709
来自专栏用户2442861的专栏

Linux下动态库(.so)和静态库(.a) 的区别

动态库(共享库)的代码在可执行程序运行时才载入内存,在编译过程中仅简单的引用,因此代码体积比较小。

971
来自专栏大前端开发

微信小程序中使用co来处理异步流程

co是一个基于ES6 Generator特性实现的【异步流程同步化】写法的工具库。

884
来自专栏Felix的技术分享

webview接入HttpDNS实践

2866
来自专栏阿杜的世界

Redis学习札记

Redis支持两种持久化方式,一种是RDB方式(快照:根据指定的规则“定时”将内存中的数据存储在硬盘上),另一种是AOF方式(在每次执行命令后都将命令本身记录下...

873
来自专栏芋道源码1024

Nginx基础——Rewrite规则

rewrite是nginx一个特别重要的指令,该指令可以使用正则表达式改写URI。可以指定一个或多个rewrite指令,按顺序匹配。

641

扫码关注云+社区