1、某日,项目开发紧张进行中,“小菜啊,这里要显示一段欢迎词”, 领导说。小菜唰唰唰很快就搞定了,代码如下:
function display_hello() { echo 'welcome to mywordpress.cn'; }
用户要使用,方法很简单,只需这么用
display_hello();
“活真好”,领导很满意。不久,产品一下子火了,源代码被下载了很多次,大家都表示调用了display_hello()。
2、很快,N多的用户,强烈要求能自定义欢迎词,不然就卸载。“小问题,不就是加个参数吗?”,小菜开始撸起,不到3分钟就出货了。
function display_hello($content) { echo $content }
“小菜啊,我们的产品现在影响很大了”,领导说,“以前,大家在调用display_hello()时都是不带参数的,为了兼容,这个接口是不能再变了,换句话说,这个函数是不能带参数滴,否则用户那边满屏都是warning,后果很严重啊!”。
“这。。。”,小菜开始抓耳捞腮,解锁各种设计模式姿势,外加大神指点,3天后小菜出了新版本(注意前方wordpress要神出现了)
function display_hello() { echo apply_filters( 'display_hello', 'welcome to mywordpress.cn' ); }
照例,领导要先review一番,“我靠,这啥啊?” ,领导有点蒙圈,运行了一下,还是显示老欢迎词,“小菜,不行啊”。小菜娓娓道来,“apply_filters()就是执行挂在display_hello这个锚点(也叫勾子)上的函数,此函数会对参数’welcome to mywordpress.cn’串进行加工,最后显示加工后的结果…”。
现在用户要使用,稍微有点麻烦,得这么用
add_filter( 'display_hello', function($content) { return 'welcome to my site'; }); display_hello();
“嗯,这个方法貌似可以…”,领导沉思片刻,好象有点头晕。。。
3、然并卵,好景不长,N多用户反映,想在显示欢迎词后做几个动作,比如发个email,发个短信啥的…,不然不愿成为付费用户。。。二话不说,小菜给出了最后的版本。
function display_hello() { echo apply_filters( 'display_hello', 'welcome to mywordpress.cn' ); do_action( 'after_display_hello' ); }
现在,用户要想使用,非常麻烦,得这么用了
add_filter( 'display_hello', function($content) { return 'welcome to my site'; }); add_action( 'after_display_hello', function($content) { wp_mail( 'mayun@taobao.com', 'email title', $content ); }); display_hello();
4、看,为了满足灵活的需求,一个简单的函数,搞成了混身是窟窿,N多的函数都可以插入进去。 确实,wordpress中勾子满天飞,勾子成为Wordpress得以进化成为CMS框架的重要基础。
结论:一个系统要在功能上很灵活,那么它在使用上必然很复杂,哲学啊。
拜读
function display_hello() {
echo apply_filters( 'display_hello', 'welcome to mywordpress.cn' );
}
请问这里,’welcome to mywordpress.cn’ 是 ‘display_hello’的参数吗?
一句话还真不好回答。
“display_hello”是一个勾子,上面勾着一串加工字符串的函数。
apply_filters()就是挨个执行这一串函数,第1个函数要加工的参数就是“welcome to mywordpress.cn”,它的返回结果作为第2个函数要加工的参数,第2个函数的返回结果又作为第3个函数的参数,…