Maison  >  Questions et réponses  >  le corps du texte

php如何实现core/plugin的设计

不要oop

不要设计模式

不追求代码优美

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

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

PHP中文网PHP中文网2771 Il y a quelques jours517

répondre à tous(3)je répondrai

  • PHP中文网

    PHP中文网2017-04-11 10:03:02

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

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

    répondre
    0
  • 高洛峰

    高洛峰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判断
    }

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

    répondre
    0
  • 高洛峰

    高洛峰2017-04-11 10:03:02

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

    répondre
    0
  • Annulerrépondre