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

时间:2011-04-27 23:50:16

标签: php wordpress namespaces

我正处于编写基本MVC WordPress插件开发框架的开始阶段,我意识到我将遇到命名冲突问题。如果我想在我正在开发的几个插件和/或主题中包含这个框架,最终我将遇到一个class_exists()无法解决的问题。

我可以将框架创建为一个独立的插件,但这需要下载我的插件或主题的任何人也下载框架,这似乎不太现实(特别是对于现有插件的升级) t目前有这样的依赖。)

无论如何,我认为你们中的很多人可能遇到过这些问题,我想知道是否有人制定了一个好的策略来解决这个问题。

如果可能的话,我不需要为每个插件添加一个唯一的前缀(这将使更新框架成为一场噩梦)。我希望有一些聪明的方法来动态命名这些类,而不必硬编码。

3 个答案:

答案 0 :(得分:1)

Namespace可以解决您的问题。

答案 1 :(得分:0)

<强>更新

向提问者道歉,因为第一次没有得到这个权利。吕克是对的。 Namespace是最佳选择。

<强>原始

有些框架选择在其类名前加上一个字母以避免冲突。 Yii就像前面的C一样:

class CClassName 
{
}

答案 2 :(得分:0)

我最终选择的解决方案是创建一个bootstrap.php文件,让框架的每个实例都注册(在一个全局变量中)它是什么版本及其文件路径。然后我注册一个在加载所有插件/主题后运行的动作,它比较所有版本,只加载与最新版本相关的类。

我看到的唯一缺点是我必须确保我的框架向后兼容,但无论如何我计划这样做。

这是我在bootstrap文件中使用的代码。显然,框架的每个实例中的版本号都需要与所包含框架的版本号相对应。

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