开发者

Class conflicts with plugin frameworks - PHP / Wordpress

I'm in the beginning stages of writing a basic MVC WordPress plugin development framework, and I'm realizi开发者_JS百科ng 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.


Namespace can resolve your problem.


UPDATE

Apologies to the asker for not getting this right the first time. The Luc is right. Namespace is the best option.

Original

Some frameworks choose to put a letter in front of their class names to avoid conflicts. Yii just buts C in front like:

class CClassName 
{
}


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' );
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜