dongyata3336 2011-04-27 23:50
浏览 22
已采纳

类与插件框架冲突 - PHP / Wordpress

I'm in the beginning stages of writing a basic MVC WordPress plugin development framework, and I'm realizing I'm going to have a naming conflict issue. If I want to include this framework in several of the plugins and/or themes I'm developing, eventually I'm going to run into an issue that class_exists() isn't going to solve.

I could create the framework as a stand-alone plugin, but that would require anyone who downloaded one of my plugins or themes to also download the framework, which doesn't seem realistic (especially for upgrades to existing plugins that don't have such a dependency currently).

Anyway, I figured many of you out there have probably run into these same issues, and I wanted to see if anyone had developed a good strategy to manage the problem.

If possible, I don't what to have to have a unique prefix per plugin (that will making updating the framework a nightmare). I'm hoping there's some clever way to dynamically name each of these classes without having to hard code it.

  • 写回答

3条回答 默认 最新

  • dsarttv037029 2011-05-26 18:48
    关注

    The solution I ended up choosing was to create a bootstrap.php file, have each instance of the framework register (in a global variable) what version it is and its file path. Then I register an action to run after all plugins/theme are loaded which compares all versions and only loads the classes associated with the most recent version.

    The only downside I see to this is that I'd have to make sure my framework is backwards compatible, but I planned on doing that anyway.

    Here is the code I used in my bootstrap file. Obviously the version number in each instance of the framework would need to correspond to the version number of the framework included.

    // register this version of the framework
    $GLOBALS['pw_framework_meta']['0.1.2'] = __FILE__;
    
    if ( !function_exists('pw_framework_init') ) {
    
        /**
         * Sort the $GLOBALS['pw_framework_meta'] variable for the latest registered
         * version of the framework. Include the PW_Framework.php file and then call init()
         */
        function pw_framework_init()
        {
            // get all the different versions registered with $GLOBALS['pw_framework_meta']
            $versions = $GLOBALS['pw_framework_meta'];
    
            // sort the versions
            uksort($versions, 'version_compare');
    
            // get the latest versions (the last in the array)
            $latest = end($versions);
    
            if ( !class_exists('PW_Framework') ) {
                require_once( dirname($latest) . '/PW_Framework.php' );
            }
            PW_Framework::init();
        }
    
        // register pw_framework_init() with the 'after_setup_theme' hook
        // This way we can ensure that all plugins or themes that might be using PW_Framework
        // have had a chance to register with the $GLOBALS['pw_framework_meta'] variable
        add_action( 'after_setup_theme', 'pw_framework_init' );
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 2024-五一综合模拟赛
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭