php如何实现core/plugin的设计
PHP中文网
PHP中文网 2017-04-11 10:01:02
0
3
515

不要oop

不要设计模式

不追求代码优美

只求能实现类似wordpress微盟discuz那样基于core/plugin的设计架构

ps:我觉得这样的设计才符合php的特性

PHP中文网
PHP中文网

认证0级讲师

membalas semua(3)
洪涛

http://justcoding.iteye.com/b...
这篇文章应该可以作为参考。

话说我最近也准备给自己的项目加上插件功能,不过是打算以 OOP 的方式实现并且放在服务容器里的,和题主正好相反呢。

小葫芦

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判断
}

也就是通过重写函数来实现扩展,这是我的愚见.

小葫芦

楼主可以参考typecho的插件机制 实现的很简单 优雅

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!