Maison > Questions et réponses > le corps du texte
只求能实现类似wordpress
、微盟
、discuz
那样基于core/plugin
的设计架构
ps:我觉得这样的设计才符合php的特性
PHP中文网2017-04-11 10:03:02
http://justcoding.iteye.com/b...
这篇文章应该可以作为参考。
话说我最近也准备给自己的项目加上插件功能,不过是打算以 OOP 的方式实现并且放在服务容器里的,和题主正好相反呢。
高洛峰2017-04-11 10:03:02
WordPress的钩子机制(事件驱动,消息处理):
add_filter / apply_filters 队列过滤模块:收到消息后,按顺序过滤元内容.
add_action / do_action 队列处理模块:收到消息后,接收元内容,进行一系列任务.
cd /path/to/wordpress
grep -rnIE 'add_filter|apply_filters|add_action|do_action' ./
./wp-content/plugins/akismet/class.akismet.php:25: add_action( 'wp_insert_comment', array( 'Akismet', 'auto_check_update_meta' ), 10, 2 );
./wp-includes/comment.php:2149: do_action( 'wp_insert_comment', $id, $comment );
./wp-content/plugins/akismet/class.akismet.php:26: add_filter( 'preprocess_comment', array( 'Akismet', 'auto_check_comment' ), 1 );
./wp-includes/comment.php:2268: $commentdata = apply_filters( 'preprocess_comment', $commentdata );
我感觉WordPress实现的插件机制也是挺复杂的,对性能影响貌似也挺大的,在需要扩展的地方都得先放好钩子,才能在这个地方开发插件进行扩展.
我说说我的另一个思路,不要OOP,不要设计模式,而且还简单直观:
首先,所有应用自带的函数都放在 /include/functions.php
里./include/common.php
里先包含插件函数,最后包含系统函数:
require APP_ROOT.'content/plugins/wp_plugin_1/functions.php';
require APP_ROOT.'content/plugins/wp_plugin_2/functions.php';
require APP_ROOT.'include/functions.php';
所有functions.php
都先判断函数是否存在再进行定义:
if(!function_exists('wp_func')) {
function wp_func() {
// 插件重写系统函数
}
} else {
// 提示冲突,插件启用失败
// 系统函数functions.php里定义的函数不需要这个else判断
// 系统里需要开放扩展的函数才进行function_exists判断
}
也就是通过重写函数来实现扩展,这是我的愚见.