php如何实现core/plugin的设计

 840126054贝尔 发布于 2022-11-14 17:52

不要oop

不要设计模式

不追求代码优美

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

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

3 个回答
  • 楼主可以参考typecho的插件机制 实现的很简单 优雅

    2022-11-14 18:00 回答
  • 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判断
    }

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

    2022-11-14 18:00 回答
  • http://justcoding.iteye.com/b...
    这篇文章应该可以作为参考。

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

    2022-11-14 18:00 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有